2016-04-25 5 views
0

コアデータに接続された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の回答ではありません。 これを解決する助けがあれば大歓迎です。

答えて

0

なぜdelegatenilに設定する必要がありますか?これは、誤って何かを実装したことを示すエラーのためです。

あなたの元の質問に答える:あなたはNSFetchedResultsControllerを使用しているので、その後のセクションは、本当の問題は、なぜあなたはnildelegateを設定しなかった、あるNSFetchedResultsControllerDelegate方法controller(_, didChangeSection, atIndex, forChangeType)

によって自動的に削除されますか?

+0

私は行をドラッグしてテーブルビューを変更しているので、デリゲートをnilに設定しました。このケースでは、NSFetchedResultsControllerがメソッドコントローラ(_、didChangeObject、atIndex、forChangeType)をトリガすることを望ましくありません。移動はすでにテーブルビューで行われているためです。私はデリゲートをアクティブに保つことを試みたが、何らかの理由でメソッドコントローラ(_、didChangeSection、atIndex、forChangeType)をトリガしない。どのようなアクションがこのメソッドをトリガーしますか? – Anders

+0

行をドラッグしているときでも、 'NSFetchedResultsController'のメソッドを使いたいと思っています。行を移動しないで、行を新しい位置に移動させる基になるデータを変更してから、 'NSFetchedResultsController'がその作業を行うようにします。 –

+0

ヒントのおかげで!私はこの周りに頭を抱えようとします。どのような良いサンプルコードを見つけるべきかについての示唆は高く評価されます。私はyoutubeにいくつかの面白いプレゼンテーションを持って参照してください:) – Anders

関連する問題