CoreData: Detail の N record を削除する方法

苦心は続くよどこまでも・・・

Detail に N の record を表示する方法は分かった。でも、これだけでは不十分で、追加、削除ができないとダメだねと。今日は削除する方法がわかったので書いておこう。

Detail に N record を表示する table view を配置し、record を左にスライドすると、削除の赤表示が出て削除できるはず、と思ったら出来ない。理由は、delegate method を実装していないから。以下を実装するとできるようになる:

- (void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle) editingStyle forRowAtIndexPath:(NSIndexPath *) indexPath

この method を実装しただけで、左にスライドすると削除の印が出る。でも、method の中身を書かないと何も起こらない。削除するためのコードは次のような感じ。

    NSOrderedSet* savedItems = [[NSMutableOrderedSet alloc] initWithOrderedSet:_detailItem.toColors];

    Colors* item = [savedItems objectAtIndex:indexPath.row];

    [_detailItem removeToColorsObject:item];

 

    // 削除処理のアニメーション。reloadData すると、アニメーションが消えてしまうので・・・

    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

    [tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows]

                         withRowAnimation:UITableViewRowAnimationAutomatic];

    

  

まず、_datailItem.toColors を取出して NSOrderdSet に収納。次に、indexPath.row で選択した record の順番を指定し、record を到底する。ここで指定するのは N の table の型で、上記の例なら Colors。

次に、delete するための method は removeTo(table name)Object になる。これ、わかんないよね。Xcode で remove とタイプして、補完してくれたのでこれかな?と思って使ってみたらうまくいったという・・・あと、頭に指定するのは _detailItem であって、_detailItem.toColors ではないぞと。

その下の code は蛇足というか、決まり文句のようなもので、削除したことを視覚的にわかりやすくしたのと、削除したのち、reload して削除した record が確実に表示されないようにしたという訳。

うーん、マジ難しかったね。