0

我正在开发一个包含两种不同类型的自定义 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];
}
}
4

3 回答 3

0

使用UIGestureRecognizer而不是touch delegates.

或者

打开相应的单元格didSelectRowAtIndexPath并执行您需要的任何操作。

于 2013-03-13T21:31:31.553 回答
0

如果您希望单元格的选择颜色不同于默认的蓝色,只需在 cellForRowAtIndexPath 方法中设置单元格的 backgroundView 属性:

UIView *backgroundView = [[UIView alloc] initWithFrame:cell.frame];
backgroundView.backgroundColor = [UIColor colorWithRed:0.90f green:0.90f blue:0.90f alpha:1.00f];
cell.selectedBackgroundView = backgroundView;
于 2013-03-13T21:33:50.817 回答
0

这个问题的答案实际上是对一个有点普遍的问题的一个有点普遍的答案。考虑到 UITable 的单元格的定制,如何处理这个问题可能并不那么明显。

它与处理自定义单元格中的触摸事件有关,然后将触摸事件也发送到父视图,在本例中为 UITable。

这是帮助解决此问题的帖子的链接:

处理父视图触摸

当您覆盖子类中的触摸方法时,写下您希望看到子类执行的功能,并在每个方法的末尾包括:

[super touchesBegan: touches withEvent: event];

对每个触摸方法执行完全相同的操作:touchesMoved、touchesEnd、touchesCancelled。

我的 UITable 现在接收触摸事件,并且 didSelectRowAtIndexPath 和 deselectRowAtIndexPath 方法现在可以工作,因为它们接收触摸事件。我希望这可以帮助别人!

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan: touches withEvent: event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{ 
    [super touchesMoved: touches withEvent: event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesEnded: touches withEvent: event];
}
于 2013-03-14T17:11:28.213 回答