UITableView:为什么不以编程方式选择和点击以选择一起播放

时间:2016-06-08 02:09:57

标签: objective-c uitableview

我有一个选择所有单元格的按钮。所以当它点击我基本上运行

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,并确认其状态已被选中。

在某个地方,不知何故,单元格在内部被“取消选择”,而不会触发任何委托方法。

1 个答案:

答案 0 :(得分:0)

我发现了发生了什么。在我的代码中的某个时刻,正在调用重新加载表视图:[self.tableView reloadData];。该方法似乎清除了单元格的选择状态,同时保留了可见单元格的选择UI,而不调用willDeselectdidDeselect的任何委托方法。