У меня есть UITableViewDataSource, который также является NSFetchedResultsControllerDelegate.
В делегате таблицы, который я реализую: (завершение здесь не указано специально)
func tableView(
_ tableView: UITableView,
trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let delete = UIContextualAction(style: .destructive, title: "Delete") { (action, sourceView, completionHandler) in
let object = self.object(at: indexPath)
do {
try ObjectManager.delete(object)
} catch let error as NSError {
print(error)
}
}
let config = UISwipeActionsConfiguration(actions: [delete])
config.performsFirstActionWithFullSwipe = true
return config
}
В источнике данных я соответствую извлеченным результатамделегирование контроллера следующим образом:
extension UserPrescriptionsTableViewDataSource: NSFetchedResultsControllerDelegate {
// MARK: - NSFetchedResultsControllerDelegate
func controllerWillChangeContent(
_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView?.beginUpdates()
}
func controller(
_ controller: NSFetchedResultsController<NSFetchRequestResult>,
didChange anObject: Any,
at indexPath: IndexPath?,
for type: NSFetchedResultsChangeType,
newIndexPath: IndexPath?) {
switch type {
case .delete:
guard let path = indexPath else { return }
tableView?.deleteRows(at: [path], with: .automatic)
case .insert:
guard let newPath = newIndexPath else { return }
tableView?.insertRows(at: [newPath], with: .automatic)
case .move:
guard let path = indexPath, let newPath = newIndexPath else { return }
tableView?.deleteRows(at: [path], with: .automatic)
tableView?.insertRows(at: [newPath], with: .automatic)
case .update:
guard let path = indexPath else { return }
tableView?.reloadRows(at: [path], with: .automatic)
}
}
func controllerDidChangeContent(
_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView?.endUpdates()
}
}
Обновление действия смахивания обновляет или не обновляет пользовательский интерфейс с помощьюручкой завершения, который вызывается в собственном блоке действия здесь:
completionHandler(true) // animates row removal
completionHandler(false) // does not remove the row
Мои проблемы заключаются в том, чтоанимация смахивания чувствует себя хорошо в использовании, когда я возвращаю false в завершении действия, делегат удаляет строку, но она не соответствует действиям пользователя так хорошо.В пробе я избегаю повторяющихся вызовов:
Я пробовал:
Я попросил источник данных спросить делегата таблицы, должен ли он обрабатывать вызовы из полученных результатов.делегат контроллера - это сработало нормально, но я получал исключения непоследовательности в некоторых крайних случаях (я хочу продолжить этот путь, но сначала хотел задать вопрос в случае, если я превращаю крота в гору :)).
Игнорирование проблемы, но она не исчезнет ?