2014/06/03

[ios]Static Cellで設定画面を作りたい

Macで、無料のブログエディタ(Blogger対応)があったら教えてくだされ。
画像を貼ることさえできればよいので。。。
なんか設定がうまくできんのよねぇ。。。


さて、それはともかく。
Static Cellで設定画面を作りたい。

まず、UITableViewControllerはこんな。

その中のTableView。
ここがStatic Cellsだ。

そうすると、"Table View Section"というのがセクション数分できる。
Table View Section自体は、特に用が無いみたいで、設定するのはRows。行数だ。



Cellの例。


さて、これを設定として使うときはどうするのか。
今回は、セクションの中身は選択肢で、タップしたものが1つだけ選択されるようなものを考えている。
ラジオボタンみたいなイメージなのだが、iOSではラジオボタンがないからcheckmarkになるんじゃないかと思っている。

ただ、iOSとしてはチェックマークとか、ディスクロージャーとか、そういうのは”Accessory"らしい。
付属物、みたいなものか?
だから、「チェックマーク? 付けたければ付ければいいやん」みたいなスタンスのようだ。
何かというと、タップしたからマークを付ける、とか、他がタップされたからマークを外すとかは、たぶん実装でやってあげないといけない、ということだ。

あ、文句を言っているように聞こえるかもしれないが、どちらかというと「私が文化をわかっていない」の方じゃないかと思っている。
あるいは、やり方をわかっていないだけか。
まあ、文句であることには変わりが無いんだけどね。

そんなわけで、こういう実装をした。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *curCell = [tableView cellForRowAtIndexPath:indexPath];
    
    //同じセクションのチェックを全部外す
    for (NSIndexPath *path in [tableView indexPathsForVisibleRows]) {
        if (path.section == indexPath.section) {
            UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:path];
            cell.accessoryType = UITableViewCellAccessoryNone;
        }
    }
    //自分にチェック

    curCell.accessoryType = UITableViewCellAccessoryCheckmark;
}

動いてはいるんだけど、ここまでやってやらんといかんの?とは思う。
あと、indexPathsForVisibleRowsで見えてる部分のindexPathを取得してるけど、じゃあ画面外まで広がってたらどうすんだよ、とか。

まず、didSelectRowAtIndexPathで、タップされたセルの情報が取得できる。
セクション番号とか、行番号とか。
NSIndexPathは、行番号とセクション番号がわかれば取得できる。
ならば、あとはセクション番号から行数がわかれば、indexPathesForVisibleRowsに頼らずに済む。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *curCell = [tableView cellForRowAtIndexPath:indexPath];
    
    //同じセクションのチェックを全部外す
    NSInteger rows = [tableView numberOfRowsInSection:indexPath.section];
    for (NSInteger row=0; row<rows; row++) {
        NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:indexPath.section];
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:path];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    //自分にチェック

    curCell.accessoryType = UITableViewCellAccessoryCheckmark;
}

どうだ?

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。