[iOS] UINib を使ったカスタム UITableViewCell の作り方(その3)ボタンの処理[改良版]

2011年6月26日日曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

[前回] Cocoaの日々: [iOS] UINib を使ったカスタム UITableViewCell の作り方(その2)ボタンの処理

前回のコードで何番目のセルがタップされたかどうかを判断するのに View階層上で特定のクラスに所属するインスタンスを検索する処理をしていた。
- (IBAction)didTouchDoitButton:(id)sender
{
    id cell = sender;
    while (![cell isKindOfClass:[CustomCell class]]) {
        cell = [cell superview];
    }
    NSIndexPath* indexPath = [self.tableView indexPathForCell:cell];
    NSLog(@"%@", indexPath);
}

その後、UITableView を見ていると特定のポイント(CGPoint)から何番目のセルを指しているかどうかを取得するメソッドがあるのに気がついた。
UITableView Class Reference - indexPathForRowAtPoint:
- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point
これを使うとクラスの検索は不要でもっと汎用的に書ける。こんな感じ。
- (IBAction)didTouchDoitButton:(id)sender event:(UIEvent*)event
{
    UITouch* touch = [[event allTouches] anyObject];
    CGPoint p = [touch locationInView:self.tableView];
    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:p];
    NSLog(@"%@", indexPath);
}
こっちの方が良さそうだ。

なおボタンのイベントハンドラは引数が0〜2個のいずれかを取るメソッドとして実装が可能で、必要に応じて使い分けられる。
-(IBAction)didTouch;
-(IBAction)didTouch:(id)sender;
-(IBAction)didTouch:(id)sender (UIEvent*)event;
今回はタッチ位置を取得する必要があったので引数に UIEvent を含む方を使った。

Responses

Leave a Response

人気の投稿(過去 30日間)