カスタム tableCells を使用して標準の UITableView を構築しています。カスタマイズされたセルが touchBegan と touchEnd で何かをしたいと思います。これらのタッチ メソッドをカスタム セル クラスに実装したところ、問題なく動作しました。
ここから楽しみが始まります。カスタム セルがあるテーブルがタッチを受けていない理由を理解するのにしばらく時間がかかりました。セルがタッチで何かを行うようにしたかっただけでなく、テーブルがそのタッチを受け取るようにして、didSelectRow/didDeselectRowAtIndexPath を呼び出せるようにしました。次に、[super touchesBegan:touches withEvent:event] をカスタム セル クラスのすべてのタッチ メソッドに追加しました。これにより、セル タッチも受け取るテーブルが得られました。プログラムを実行すると、最初の 2 ~ 3 回のタッチがセルとテーブルの両方に登録されます。その後、セルは毎回タッチを登録し続けますが、テーブルは1回おきにタッチを登録するだけですこの奇妙な振る舞いは私を困惑させました。ビュー階層の概念を調べて、それが問題になる可能性があるかどうかを確認し、hitTest などの代替手段を検討しましたが、これに対する明白な解決策として際立ったものはありません。なぜこれが起こるのかについて誰かが理論を持っていますか? カスタム セル タッチと didSelectRowAtIndexPath メソッドのコードを次に示します。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches]anyObject];
if([touch view] == self.nameLabel) {
CGFloat isRed = 151.0/255.0;
CGFloat isGreen = 151.0/255.0;
CGFloat isBlue = 151.0/255.0;
self.nameLabel.backgroundColor = [[UIColor alloc]initWithRed:isRed green:isGreen blue:isBlue alpha:1.0];
if(!self.currentlySelected) {
NSLog(@"if(!self.currentlySelected");
self.currentlySelected = YES;
[self.accessoryButton setImage:[UIImage imageNamed:@"Checkmark.png"]forState:UIControlStateNormal];
self.accessoryButton.hidden = NO;
}
else {
NSLog(@"if(self.currentlySelected");
self.currentlySelected = NO;
self.accessoryButton.hidden = YES;
[self.accessoryButton setImage:nil forState:UIControlStateNormal];
}
}
NSLog(@"Touch Began");
[super touchesBegan:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesMoved:touches withEvent:event];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches]anyObject];
if([touch view] == self.nameLabel) {
self.nameLabel.backgroundColor = [[UIColor alloc]initWithRed:self.isRed green:self.isGreen blue:self.isBlue alpha:1.0];
}
NSLog(@"Touch End");
[super touchesEnded: touches withEvent: event];
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesCancelled:touches withEvent:event];
}
didSelectRowAtIndexPath:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Method didselectRow was Called");
//If it is in the Alley section
if(indexPath.section == 0) {
//If the selected cell is the same as the last selected cell
if([self.lastIndexPathForAlleyCells isEqual:indexPath]) {
NSLog(@"Same");
[self.tableView beginUpdates];
AlleyTableViewCell *previousCell = (AlleyTableViewCell *)[self.tableView cellForRowAtIndexPath:self.lastIndexPathForAlleyCells];
previousCell.currentlySelected = NO;
self.lastIndexPathForAlleyCells = nil;
previousCell.accessoryButton.hidden = YES;
[self.tableView endUpdates];
}
//Else the selected cell is not the last selected cell
else {
[self.tableView beginUpdates];
NSLog(@"Not the same");
AlleyTableViewCell *previousCell = (AlleyTableViewCell *)[self.tableView cellForRowAtIndexPath:self.lastIndexPathForAlleyCells];
previousCell.currentlySelected = NO;
previousCell.accessoryButton.hidden = YES;
AlleyTableViewCell *cell = (AlleyTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
cell.currentlySelected = YES;
cell.accessoryButton.hidden = NO;
self.lastIndexPathForAlleyCells = indexPath;
[self.tableView endUpdates];
}
}
else if(indexPath.section == 1) {
NSLog(@"Section 1 shouldn't be here");
PlayerTableViewCell *cell = (PlayerTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
[cell.accessoryButton setImage:[UIImage imageNamed:@"Checkmark.png"] forState:UIControlStateNormal];
[cell setSelected:NO animated:NO];
}
}