前回のコードで何番目のセルがタップされたかどうかを判断するのに 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