我有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
,因此返回列表清除了我的选择。
答案 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被调用时,您可以触发选择状态。