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 が確実に表示されないようにしたという訳。
うーん、マジ難しかったね。