取消选择 NSTableView 行时出现异常

Posted

技术标签:

【中文标题】取消选择 NSTableView 行时出现异常【英文标题】:Exception when deselecting NSTableView row 【发布时间】:2011-09-05 18:56:14 【问题描述】:

我对此有点迷茫......似乎我找不到为什么我不能从我的 NSTableView 中取消选择行。我允许在 Interface Builder 中进行空选择,但只要我调用 deselectRow: 或 deselectedAll:,就会出现异常。

例如,使用以下代码:

NSLog(@"Currently selected row index: %ld", [self.tableView selectedRow]);
[self.tableView deselectRow:[self.tableView selectedRow]];

我明白了:

2011-09-05 MyApp[18939:707] Currently selected row index: 1
2011-09-05 MyApp[18939:707] *** -[__NSArrayM objectAtIndex:]: index 18446744073709551615 beyond bounds [0 .. 3]

如果我使用硬编码值(比如 0)调用 deselectRow: 进行测试,我什至会遇到同样的错误。所以我想错误源于与我的 NSArrayController 或其他东西的绑定?

【问题讨论】:

异常可能发生在某些代码对取消选择做出反应...您有类似的代码吗? 最终的原因是什么? 【参考方案1】:

我的解决方案(我知道很原始)

 if(row != UINT64_MAX)

【讨论】:

【参考方案2】:

我在NSTableViewDelegate#tableViewSelectionDidChange 内部调用NSTableView#deselectRow,这触发了对tableViewSelectionDidChange 方法的另一个调用。在第二次调用中,NSTableView#selectedRow 属性等于 -1,这是传递给 deselectRow 的无效值。

为避免这种情况,只需使用 selectedRow >= 0 条件包装 deselectRow 调用。

【讨论】:

【参考方案3】:

像这样的非常长的整数通常意味着正在将内存地址转换为整数。这通常是由将对象传递给标量变量引起的。

在 IB 中,查看接口元素的 selected object 绑定。在某些时候,您将一个对象传递给deselectRow,而不是一个标量整数。

【讨论】:

以上是关于取消选择 NSTableView 行时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

NSTableview 中选定行的标签颜色

隐藏 NSTableView 标头?

可可:核心数据 + NSTableView

而在 indexPath 的 didselectrow 上选择取消选择行时会崩溃

tableView:didSelectRowAtIndexPath:在使用 setAllowsMultipleSelectionDuringEditing 时取消选择行时不会被调用

单击表格视图行时出现异常