コアデータに接続されたUITableViewがあります。テーブルビューには動的なセルがあり、行をセクション(カテゴリ)にグループ化します。最後の行をセクションから移動するときにセクションヘッダーを削除する方法
セクション間をドラッグして行を移動できます。これは、行をドラッグしてセクションが空になる場合を除いて、コアデータでうまく動作します。私はセクションヘッダーが消えて欲しいですが、内部に行がないヘッダーのままです。その後、行をドラッグするとエラーが発生します。
didChangeObjectとdidChangeSectionのNSFetchedResultsController関数を実装しました。しかし、行をドラッグすると、fetchedResultsControllerのデリゲートをnilに設定する必要があることがわかりました。
ここでは、移動を処理するコードの一部です。
func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
// Create array of fetched items from the stack
var items = fetchedResultsController.fetchedObjects! as! [Item]
// Convert the index paths to row number in the table.
let destinationRow = rowAtIndexPath(destinationIndexPath)
var sourceRow = rowAtIndexPath(sourceIndexPath)
// Source row has to be reduced by one if it was moved to lower section because tableview is counting the row twice, once in the new section and once as the row index in the old section.
if sourceIndexPath.section > destinationIndexPath.section {
sourceRow -= 1
}
let newCategory = fetchedResultsController.sections![destinationIndexPath.section].name
// Get the item of from the source index path and update the category
let item = fetchedResultsController.objectAtIndexPath(sourceIndexPath) as! Item
item.category = newCategory
// Do not trigger delegate methods when changes are made to core data
fetchedResultsController.delegate = nil
// Move the item in core data
items.removeAtIndex(sourceRow)
items.insert(item, atIndex: destinationRow)
do {
try coreDataStack.context.save()
} catch {
fatalCoreDataError(error)
}
fetchedResultsController.delegate = self
}
これは特にSwiftの回答ではありません。 これを解決する助けがあれば大歓迎です。
私は行をドラッグしてテーブルビューを変更しているので、デリゲートをnilに設定しました。このケースでは、NSFetchedResultsControllerがメソッドコントローラ(_、didChangeObject、atIndex、forChangeType)をトリガすることを望ましくありません。移動はすでにテーブルビューで行われているためです。私はデリゲートをアクティブに保つことを試みたが、何らかの理由でメソッドコントローラ(_、didChangeSection、atIndex、forChangeType)をトリガしない。どのようなアクションがこのメソッドをトリガーしますか? – Anders
行をドラッグしているときでも、 'NSFetchedResultsController'のメソッドを使いたいと思っています。行を移動しないで、行を新しい位置に移動させる基になるデータを変更してから、 'NSFetchedResultsController'がその作業を行うようにします。 –
ヒントのおかげで!私はこの周りに頭を抱えようとします。どのような良いサンプルコードを見つけるべきかについての示唆は高く評価されます。私はyoutubeにいくつかの面白いプレゼンテーションを持って参照してください:) – Anders