UITableView didSelectRowAt возвращает неправильную ячейку tableViewCell при indexPath

#swift #uitableview #nsfetchedresultscontroller #didselectrowatindexpath

#swift #uitableview #nsfetchedresultscontroller #didselectrowatindexpath

Вопрос:

Я создаю приложение для планирования задач, и я столкнулся с серьезной ошибкой в моей ячейке tableViewCell. Всякий раз, когда я выбираю строку более одного раза, вызывается неправильный indexPath в строке.

Если я закомментирую свой resultsController.delegate , приложение работает нормально. Однако мне нужен делегат контроллера результатов для обновления представления таблицы каждый раз, когда создается новый план.

 override func viewDidLoad() {
    super.viewDidLoad()

    // Create Request
    let request:NSFetchRequest<Plan> = Plan.fetchRequest()
    let sortDescriptors = NSSortDescriptor(key: "date", ascending: true) // make request more specific
    request.sortDescriptors = [sortDescriptors]

    // Init our results controller
    resultsController = NSFetchedResultsController(
        fetchRequest: request,
        managedObjectContext: coreDataStack.managedContext,
        sectionNameKeyPath: nil,
        cacheName: nil
    )
    resultsController.delegate = self

    // Perform fetch request
    do {
        try resultsController.performFetch()
    } catch {
        print("Perform fetch error (error)")
    }
}
  

Вот соответствующие TableViewDelegates

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "showNewPlan", sender: tableView.cellForRow(at: indexPath))
}
  

Кроме того, я также добавил свою функцию подготовки для навигации.

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let _ = sender as? UIBarButtonItem , let vc = segue.destination as? NewPlanViewController {
        vc.managedContext = resultsController.managedObjectContext
    }
    if let cell = sender as? UITableViewCell , let vc = segue.destination as? NewPlanViewController {
        vc.managedContext = resultsController.managedObjectContext
        if let indexPath = tableView.indexPath(for: cell) {
            let plan = resultsController.object(at: indexPath)
            vc.plan = plan
        }
    }
}
  

resultsControllerDelegate Так я обновляю свой tableViewCells .

 func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
    switch type {
    case .insert:
        if let indexPath = newIndexPath {
            tableView.insertRows(at: [indexPath], with: .automatic)
        }
    case .delete:
        if let indexPath = indexPath {
            tableView.deleteRows(at: [indexPath], with: .automatic)
        }
    case .update:
        if let indexPath = indexPath, let cell = tableView.cellForRow(at: indexPath) {
            let plan = resultsController.object(at: indexPath)
            cell.textLabel?.text = plan.title
        }
    default:
        break
    }
}
  

Комментарии:

1. У вас возникли проблемы с UITableView и не отображается какой-либо ее код. Не могли бы вы, пожалуйста, написать код, влияющий на UITableView ?

2. Вы должны показать UITableViewDelegate функции, подобные didSelectRowAtIndex , и другие.

3. Я очень благодарен за ваши ранние ответы. @flyingBear я включил функции {UITableViewDelegate} в новую редакцию вопроса.