我真的要疯了。
我有一个服务应用程序,它打开一个非常简单的NSPanel
它由一个NSTableView
、一个标签和三个NSButton
控件组成。
而已。
表视图是基于视图的,有四种不同的NSTableCellView
在 IB 中定义了四个不同的行。
表格代码非常简单;我的NSWindowController
子类既是数据源又是委托。在大多数情况下,一切都很完美:
- 窗口打开
- 预期的数据源方法(
numberOfRowsInTableView:
和tableView:objectValueForTableColumn:row:
) 被调用 tableView:isGroupRow:
表格通过和填充其视图和部分分隔符tableView:viewForTableColumn:row:
- 空选择被禁用,因此委托立即收到
tableView:shouldSelectRow:
消息,表格自动选择第一行 - 表格完全按照应有的方式显示,并且第一行被选中
一切看起来都很完美,但我无法选择不同的行。我在表格中单击的任何内容都不会更改选择。
我努力了:
- 子类化
NSTableCellView
并验证它正在接收hitTest:
呼叫 - 尝试“破解”表格单元格视图
hitTest:
,使其始终返回nil
- 在表格单元格视图内的控件视图上尝试了“拒绝第一响应者”、“启用”、“可编辑”属性的各种组合
- 尝试删除所有控制视图。所以表格单元格视图是空的
- 尝试实施
tableView:selectionIndexesForProposedSelection:
而不是tableView:shouldSelectRow:
- 将其更改
NSPanel
为常规NSWindow
似乎没有任何区别。我在表格中单击的任何内容都不会更改选择,并且我的表格视图委托永远不会收到另一个tableView:shouldSelectRow:
呼叫。
请注意,NSButton
窗口中的所有其他 ( ) 控件都可以正常工作。我可以点击其中任何一个。
更新#1
根据评论,我尝试将产品更改为普通旧的.app
,但这没有任何区别。
我的下一步是更多地使用委托方法,并将问题缩小到:
如果我实现
tableView:shouldSelectRow:
,表调用我的委托方法两次(因为我关闭了“空选择”,表必须首先确定默认选择哪一行,所以我得到两个调用,一个用于第 0 行(NO)和一个第 1 行的第二个(是))。但是,如果我在表格中单击,我永远不会收到另一个tableView:shouldSelectRow:
.如果我删除 的实现
tableView:shouldSelectRow:
,表选择就会神奇地开始工作。(除了您可以选择组行,这是磨损的事实。)还尝试实施
tableView:selectionIndexesForProposedSelection:
而不是tableView:shouldSelectRow:
; 相同的行为
因此,如果我实现任何委托方法来确定哪些行是可选的,我就无法选择任何行。叹
更新#2
我对应用程序进行了下注和重构,因此现在有一个新的视图控制器对象专门用于管理表视图(而不是重载窗口控制器)。所有数据模型和委托方法都移到了新的视图控制器中。
此外(认为 IB 中的表格视图可能有些奇怪),我从 NIB 中删除了表格视图并重新创建了它及其所有连接。
不幸的是,这些变化都没有任何区别。如果tableView:shouldSelectRow:
实现了,则该表不可用。删除该方法,它会再次起作用。
更新#3
而且它变得更奇怪了:我认为我可以“破解”行选择问题,我实现了表视图委托方法tableViewSelectionIsChanging:
和tableViewSelectionDidChange:
. 也不会被叫。即使我删除tableView:shouldSelectRow:
,允许表格选择工作,也没有收到tableViewSelectionIsChanging:
或tableViewSelectionDidChange:
收到过。
但是,如果我为NSTableViewSelectionIsChangingNotification
and添加观察者NSTableViewSelectionDidChangeNotification
,则会收到这些观察者。
另请注意,NSViewController
作为表视图的委托和数据源的子类明确符合<NSTableViewDelegate>
and <NSTableViewDataSource>
,因此不应该有任何理由让表视图对实现的委托方法感到困惑。