我正在开发一个包含两种不同类型的自定义 UITableViewCells 的 UITableView,每个单元格都设置为 UITable 的不同部分。我希望单元格在触摸时突出显示为不同的颜色,然后在触摸结束后恢复为以前的颜色。由于这不遵循标准 UITableViewCell 的标准触摸高亮实现,因此我在自定义单元格类中添加了 TouchesBegan() 和 TouchesEnd() 方法以获得这种效果。但是,UITable 不会捕获任何触摸,因此不会执行其他标准表功能所需的 didSelectRowAtIndexPath() 或 deselectRowAtIndexPath() 方法。如果我注释掉自定义单元格的 TouchesBegan/TouchesEnd 方法,那么 UITable 将捕获触摸并调用这些方法。有没有办法让自定义单元格执行它们的触摸方法以及 UITable 在单次触摸时执行 didSelect/deselect 方法?这是我对 UITable 的第一次破解,并具有预期的自定义功能,我很挣扎。如果我的代码中除了我的问题之外的任何内容不合适,我深表歉意,并提前感谢您的建议。以下是这些部分的代码:
自定义单元格的触摸方法:
-(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) {
self.currentlySelected = YES;
self.accessoryButton.hidden = NO;
}
else {
self.currentlySelected = NO;
self.accessoryButton.hidden = YES;
}
}
}
-(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];
}
}
对于 UITableViewController 中的 didSelect/DeselectRow 方法:
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0, self.tableView.bounds.size.width, 30.0)];
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectZero];
CGFloat isRed = 84.0/255.0;
CGFloat isGreen = 84.0/255.0;
CGFloat isBlue = 84.0/255.0;
self.headerColor = [[UIColor alloc]initWithRed:isRed green:isGreen blue:isBlue alpha:0.5];
headerLabel.backgroundColor = self.headerColor;
headerLabel.opaque = NO;
headerLabel.textColor = self.textColor;
headerLabel.highlightedTextColor = [UIColor whiteColor];
headerLabel.font = [UIFont systemFontOfSize:18.0];
headerLabel.frame = CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, 30.0);
if (section == 0) {
[headerView setBackgroundColor:self.backgroundColor];
headerLabel.text = @"Alley";
[headerView addSubview:headerLabel];
}
else {
[headerView setBackgroundColor:self.backgroundColor];
headerLabel.text = @"Bowlr";
[headerView addSubview:headerLabel];
}
return headerView;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if(self.lastIndexPathForAlleyCells == indexPath) {
[self.tableView beginUpdates];
[self.tableView deselectRowAtIndexPath:self.lastIndexPathForAlleyCells animated:NO];
[self.tableView endUpdates];
}
if(indexPath.section == 0) {
[self.tableView beginUpdates];
[self.tableView deselectRowAtIndexPath:self.lastIndexPathForAlleyCells animated:NO];
AlleyTableViewCell *cell = (AlleyTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
cell.accessoryButton.hidden = NO;
self.lastIndexPathForAlleyCells = indexPath;
[self.tableView endUpdates];
}
else if(indexPath.section == 1) {
PlayerTableViewCell *cell = (PlayerTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
[cell.accessoryButton setImage:[UIImage imageNamed:@"Checkmark.png"] forState:UIControlStateNormal];
[cell setSelected:NO animated:NO];
}
}