TableViewで編集時の複数選択

TableViewで複数のセルを選択し一度に操作したいことがあったのですが なかなか悩ましかったのでメモっちゃいます。 手順としては

  1. 編集時の左側に出る赤いマークを消す
  2. 編集時にセルの選択ができるようにする
  3. セル画選択されたら独自でマークを出し、indexPathを記録する
  4. 実行ボタンが押されたら、indexPathを元に操作する

といった感じです。 ちなみに、indexPathでセルを管理するので、セルの移動と同時に行うと挙動がおかしくなります。

編集時の左側に出る赤いマークを消す

独自でチェックマークの画像を出すので、デフォルトで出てくる赤いマークが表示されないようにします。

1
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleNone; }

編集時にセルの選択ができるようにする

allowsSelectionDuringEditing というのがあるので、これをYESにすれば編集中でも tableview:didSelectRowAtIndexPath:がよばれるようになります。

1
[self.tableView setAllowsSelectionDuringEditing:YES];

セル画選択されたら独自でマークを出し、indexPathを記録する

1
/* _selectedCellIndexPaths はNSMutableArrayのメンバ変数 */ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ if(tableView.editing){ UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if([self isSelectedIndexPath:indexPath]){ cell.image = [UIImage imageNamed:@"checkmark_off.png"]; [_selectedCellIndexPaths removeObject:indexPath]; }else{ cell.image = [UIImage imageNamed:@"checkmark_on.png"]; [_selectedCellIndexPaths addObject:indexPath]; } } }

実行ボタンが押されたら、indexPathを元に操作する

1
-(void)tapDoneButton{ for( NSIndexPath *indexPath in selectedCellIndexPaths ){ //処理... } }

以上でTableViewの複数選択ができるようになります。 ちなみに非公開APIを使ってゴニョゴニョする方法もあるみたいですが、それほど手間ではないので独自で実装することをお勧めします。