#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} в новую редакцию вопроса.