【发布时间】:2014-01-21 22:22:50
【问题描述】:
我有一个带有自定义 UITableCellView 子类的 UITableView。我想将其中一行显示为活动的或选中的。我的单元格中的控件有自己的手势,但我在右侧有可以进行选择的区域。我(天真地)认为我可以表明我想要一个复选标记样式的配件,但苹果的文档说
此控件不跟踪触摸。表视图的委托 可以管理部分行中的复选标记(可能会限制 选中该部分的一行)在其 tableView:didSelectRowAtIndexPath: 方法。
我不确定如何解释它,但我将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,因此返回列表清除了我的选择。
【问题讨论】:
标签: ios uitableview ios7