我有一个选择所有单元格的按钮。所以当它点击我基本上运行
for (int i=0; i<self.myDataSource.count; i++) {
NSIndexPath *tmpIndexPath = [NSIndexPath indexPathForRow:i inSection:0];
[self.tableView selectRowAtIndexPath:tmpIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:tmpIndexPath];
}
并且效果很好,因为所有单元格的UI都能正确更新等等。
但是现在当我尝试点击一个单元格时(我认为这意味着我现在正在取消选择它,因为我以编程方式选择它)而不是调用tableView: didSelectRowAtIndexPath:
委托方法,所以对用户来说它看起来像“没有任何事情发生”,因为它从选定状态变为选定状态。再次点击它将正确触发tableView: didDeselectRowAtIndexPath:
委托方法。
似乎以编程方式调用选择单元格实际上并没有选择单元格。 UI更新的唯一原因是我手动调用tableView: didSelectRowAtIndexPath:
方法。
调用[self.tableView selectRowAtIndexPath:tmpIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
是否实际上没有以默认点击选择的方式选择单元格?有谁知道这里发生了什么?
注意:我启用了多个选项,因此我认为这不是问题。
更多细节:我决定检查细胞是否在两点被选中。首先,我在致电selectRowAtIndexPath
后直接查看:
[self.tableView selectRowAtIndexPath:tmpIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
if ([[self.tableView cellForRowAtIndexPath:tmpIndexPath] isSelected]) {
NSLog(@"Supposedly selected... right");
}
[self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:tmpIndexPath];
返回true并打印到控制台。
现在,如果相反,我检查是否使用在我点击单元格时触发的didSelect...
方法中选择了单元格,它将返回false。这是尽管JUST以编程方式将其设置为true,并确认其状态已被选中。
在某个地方,不知何故,单元格在内部被“取消选择”,而不会触发任何委托方法。
答案 0 :(得分:0)
我发现了发生了什么。在我的代码中的某个时刻,正在调用重新加载表视图:[self.tableView reloadData];
。该方法似乎清除了单元格的选择状态,同时保留了可见单元格的选择UI,而不调用willDeselect
或didDeselect
的任何委托方法。