UITableViewCellを削除ボタンを使って削除する

iPhoneのアプリケーションでは、交通標識の一時停止マークのようなものをクリックすると、削除ボタンが現れて項目が削除できるというギミックがあります。こういうのです。

このボタンを押して削除したときにはどのようなdelegateがおこなわれるか、そしてどのようにして項目を削除するのかということにちょびっとはまったので書いておきます。

まず、このボタンを押すとtableView:commitEditingStyle:forRowAtIndexPath:というdelegateがおこなわれます。

そして削除時なんですが、deleteRowsAtIndexPaths:withRowAnimation:メソッドを利用して削除します。
このとき注意すべき点は、このメソッドを呼び出した際にUITableViewのtableView:numberOfRowsInSection: delegateが呼び出されるということです。
そこで、UITableViewのcellに表示している項目を例えばNSMutableArrayなどで管理している場合には、そのNSMutableArrayの項目を先に削除しておかないと、例外が発生します。

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = indexPath.row;

    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        [tableViewArray removeObjectAtIndex:row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
    }
}

のように先にNSMutableArrayの方を削除してから、deleteRowsAtIndexPaths:withRowAnimation:メソッドを呼び出す訳です。