UISwipeActionsConfiguration с NSFetchedResultsControllerDelegate обновления - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть 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 в завершении действия, делегат удаляет строку, но она не соответствует действиям пользователя так хорошо.В пробе я избегаю повторяющихся вызовов:

Я пробовал:

  • Я попросил источник данных спросить делегата таблицы, должен ли он обрабатывать вызовы из полученных результатов.делегат контроллера - это сработало нормально, но я получал исключения непоследовательности в некоторых крайних случаях (я хочу продолжить этот путь, но сначала хотел задать вопрос в случае, если я превращаю крота в гору :)).

  • Игнорирование проблемы, но она не исчезнет ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...