如何使用自定义UITableViewCell子类进行(自定义)选择

时间:2014-01-21 22:22:50

标签: ios uitableview ios7

我有UITableView个自定义UITableCellView子类。我想将其中一行显示为活动或已选中。我的单元格中的控件有自己的手势,但我在右边的区域可以进行选择。我(天真)认为我可以说我想要一个复选标记风格配件,但Apple的文档说

  

此控件不跟踪触摸。表视图的委托   可以管理一部分行中的复选标记(可能限制行   在其中检查标记到该部分的一行)   tableView:didSelectRowAtIndexPath:method。

我不确定如何解释,但我将tableView:didSelectRowAtIndexPath:方法放在我的委托中,它永远不会触发。无论我在哪里触摸我的手机(在有可触摸控制的部分)。所以我很好奇为什么这不起作用?我还注意到,无论我如何在单元格上设置selected属性,复选标记始终显示,因此我认为它不是真正意味着要使用选择指示器。

但我真的很好。我真的不想要一个复选标记,我宁愿做一些类似邮件的东西,当它在左侧进行多选时,单选按钮风格的圆圈。然后,这让我陷入了如何进行的困境。我应该只在右侧添加一个按钮控件,在我的自定义单元子类中适当地操作图像吗?在这种情况下,我是否会弄乱按钮的背景图像?或者只是图像?因为选择一个需要取消选择其他的,将它连接到表视图委托而不是子类的最佳方法是什么?或者我应该创建自定义NSView子类?

更新

我取下了配件。我添加了一个UIImageView来显示选择状态。因为我的单元格中的子控件使用保持手势,所以选择点击使得它几乎到达单元格的所有位置。我使用以下方法同步视觉选择状态:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    self.selectionView.image = self.selected ? [UIImage imageNamed: @"selected"] : [UIImage imageNamed: @"not_selected"];
}

我的自定义控制器添加了以下方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [Site setCurrent: self.allSites[indexPath.row]];
    [[Site current] pullValves];
}

最后我觉得第一种方法是更新视觉状态,而不是响应用户意图,属于第二种方法。第一个在不同时间触发,但第二个在用户实际进行点击时适用。

最后,我必须以编程方式设置

self.clearsSelectionOnViewWillAppear= NO;

无论我在故事板中设置什么,该值都是YES,因此返回列表清除了我的选择。

1 个答案:

答案 0 :(得分:1)

您是为自己创建的每个细胞添加手势吗?我会把它从那里拿回来并在主控制器上创建一个手势,它保存你的tableview(不是单个单元格)。

将其添加到主控制器,以便控制器可以相应地处理手势。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

如果您需要跟踪被触摸的单元格(例如,对于平移手势),您可以获取给定手势识别器的索引路径。

CGPoint p = [recognizer locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];

从那里,我们回到您的目标:跟踪您的活动单元格。 tableView:didSelectRowAtIndexPath需要被命中(希望上面的步骤有帮助)。存储您需要保留选定项目的某种标识符。当tableView:willDisplayCell:forRowAtIndexPath被调用时,您可以触发选择状态。