makoラボ

日常や勉強会や技術ネタ

選択されているUITableViewのセルにチェックマークをつける

f:id:mako_wis:20140307110219p:plain

上の画像のようにUITableViewを使って選択肢を表示するようなUIを使うことって案外あるんですよね。 その時にはほぼ必ずチェックした事を示すためにチェックマークを付けると思います。

今回は選択されているUITableViewのセルにチェックマークをつける方法を書いていきます。

UITableView内で保持している選択状態に応じてチェックマークをつけていきます。配列とかに選択状態とか持たせた方がええんじゃね?とか意見があるような気がしますが今回はあくまでUITableViewの機能を利用しての方法で進めていきます。

ちなみに以前書いたUITableViewのセルを選択した時にチェックマークをつける方法はこちら

選択されているセルにチェックマークをつける

今回はcellForRowAtIndexPath内で選択されているセルに対してチェックマークをつけます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
    cell.textLabel.text = @"hogehoge";

    // 一旦チェックマークを外す
    cell.accessoryType = UITableViewCellAccessoryNone;    

    // UITableViewから選択済みのインデックスを取り出す
    for (NSIndexPath *selectedindex in [tableView indexPathsForSelectedRows]) {
        // 選択済みかどうかチェック
        NSComparisonResult result = [selectedindex compare:indexpath];
        if (result == NSOrderedSame) {
           // 選択済みであればチェックマークを付ける
           cell.accessoryType = UITableViewCellAccessoryCheckmark;
           break;
        }
    }
    
    return cell;
}

対象のUITableViewの中から選択済みのインデックスを全件取得して、現在表示しようとしているセルのインデックスと比較して選択済みであればAccessoryでチェックマークをつけています。

UITableView自体に対象のインデックスが選択済みかどうかのメソッドくらいあっても良さそうなのですが、残念ながらなさそうなので泥臭い事をしてしまってます。

今回は説明のためにcellForRowAtIndexPath内にインデックスのチェック処理を書いちゃってますが、UITableViewにカテゴリでチェック処理メソッドを追加しとくもの良いかと思います。

@implementation UITableView (hoge)

- (BOOL)isSelectedIndexpath:(NSIndexPath *)indexpath {
    for (NSIndexPath *selectedindex in [self indexPathsForSelectedRows]) {
        NSComparisonResult result = [selectedindex compare:indexpath];
        if (result == NSOrderedSame) {
            // 選択済みであればtrue
            return true;
        }
    }
    // 未選択であればfalse
    return false;
}
@end

おわり

選択されているUITableViewのセルにチェックマークをつける方法を書いてみました。以前書いた選択した時にチェックマークをつける方法と合わせ技で選択状態を配列等に入れて保持しなくてもチェックマークを表示する事ができると思います。

表示する度にグルグルと処理を回してるので件数が多い場合とかはチェック状態の保持を考えたほうが良さそうですね。

そもそもデフォルトでチェックマークをチェック状態の表示で使えないのはどうなんでしょうかねえ・・・そこがハイライトから切り替えられればこんなことしなくて良いのに・・・