取消选择 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 行时出现异常的主要内容,如果未能解决你的问题,请参考以下文章
而在 indexPath 的 didselectrow 上选择取消选择行时会崩溃
tableView:didSelectRowAtIndexPath:在使用 setAllowsMultipleSelectionDuringEditing 时取消选择行时不会被调用