2017-07-15 6 views
0

私はテーブルビューからアイテムの削除をアニメーション化しようとしています。 CoreDataで取り出した結果コントローラを使用しています。私が抱えている問題は、行数が項目数とどのように一致しなければならないかについて例外が発生していることです。ここでフェッチ結果のコントローラで削除された行をアニメ化する

は、私が削除したときに私が取得エラーです:

理由:「無効な更新:セクション0の行の無効な数の更新(4)の後に、既存のセクションに含まれる行の数 (0が挿入され、0が削除された) の行の数をプラスまたはマイナスして、そのセクションに含まれる行の数と同じでなければなりません。 update(3) (0は動かされ、0は動かされた)。

そして、ここではコードです:

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } 
    let context = appDelegate.persistentContainer.viewContext 

    if editingStyle == .delete { 
     // Delete the row from the data source 
     context.delete(fetchedResultsController.object(at: indexPath)) 

     do { 
      try context.save() 
      // Animate deleted row 
      tableView.deleteRows(at: [indexPath], with: .fade) 
     } catch { 
      print("There was an error: \(error)") 
     } 
    } 
} 

ありがとうございました。

答えて

0

また、配列からアイテムを削除する必要があります(またはデータソースが何であれ)。

は基本的には、tableView(_:numberOfRowsInSection:)はあなたのUITableViewに削除をアニメーション化するとき

+0

これは私が通常行うことですが、 'fetchedResultsController'ではフェッチされたオブジェクトのプロパティを更新できません。フェッチされた結果コントローラは、データソースの更新を処理することになっています(ただし、それはアニメーション化されません)。 – DavidVII

+0

'NSFetchedResultsControllerDelegate'からテーブルビューのアニメーション化を試みましたか? ここには(Objective-Cの)例があります:https://developer.apple.com/documentation/coredata/nsfetchedresultscontrollerdelegate – Dule

+0

私はそれを試していませんが、私はそれを打ち明けて見ます。私はかなり新しいので、私はそれを迅速に変換することができるかどうかを見なければならない。 – DavidVII

0

問題1つの以下のオブジェクト(またはしかしあなたが削除された多くの項目)を返すために持っているあなたはそれを削除するときに、行を削除し、その後、削除しているということですNSFetchedResultsControllerDelegateがあなたに言っているときにもう一度。行は一度だけ削除する必要があります。可能な解決策は2つあります。

1)オブジェクトは、コンテキストから削除されたとき、あなたのViewControllerをお知らせいたしますtableView.deleteRows

fetchedResultsControllerデリゲートを削除します。したがって、単にコアデータからオブジェクトを削除し、コンテンツが適切に更新されることを信頼してください。あなたがバックグラウンドで物事を保存している場合は、少し遅れがあるかもしれません。

2)は、デリゲートのコールバックfetchedResultsControllerコールバックを無視するオブジェクトを削除する前に、ブール権を設定し

、あなたが保存した直後に、それ解除を無視します。 Appleはこのアプローチをドキュメントに提案しています。

私は個人的には、私が最も簡単に見つける最初のアプローチを使用します。私はまた、fetchedResultsControllerの更新を無視することに不快です。なぜなら、それらが同期しなくなるとアプリケーションがクラッシュする可能性があるからです。

関連する問題