【发布时间】:2018-06-19 01:38:26
【问题描述】:
我真的要疯了。
我有一个服务应用程序,它打开一个非常简单的NSPanel,它由一个NSTableView、一个标签和三个NSButton 控件组成。
就是这样。
表格视图是基于视图的,并且在 IB 中定义了四个不同的NSTableCellView 行。
表格代码非常简单;我的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,但没有任何区别。
我的下一步是对委托方法进行更多修改,并将问题缩小到以下范围:
-
1234563一个用于第 0 行(否),另一个用于第 1 行(是))。但是,如果我在表格中单击,我再也不会收到
如果我删除
tableView:shouldSelectRow:的实现,表格选择就会神奇地开始工作。 (除了你可以选择分组行,这是磨损的事实。)还尝试实现
tableView:selectionIndexesForProposedSelection:而不是tableView:shouldSelectRow:;相同的行为
tableView:shouldSelectRow:。
因此,如果我实现任何委托方法来确定哪些行是可选的,我就无法选择任何行。 叹息
更新 #2
我对应用程序进行了下注和重构,因此现在有一个新的视图控制器对象专门用于管理表格视图(而不是重载窗口控制器)。所有数据模型和委托方法都移到了新的视图控制器中。
另外(认为 IB 中的表格视图可能有些奇怪),我从 NIB 中删除了表格视图并重新创建了它及其所有连接。
很遗憾,这些更改都没有任何区别。如果实现了tableView:shouldSelectRow:,则该表不可用。删除该方法,它又可以工作了。
更新 #3
而且它变得更奇怪了:我认为我可以“破解”行选择问题,我实现了表视图委托方法 tableViewSelectionIsChanging: 和 tableViewSelectionDidChange:。也不会被叫。即使我删除了tableView:shouldSelectRow:,允许表格选择工作,也不会收到tableViewSelectionIsChanging: 或tableViewSelectionDidChange:。
但是,如果我为 NSTableViewSelectionIsChangingNotification 和 NSTableViewSelectionDidChangeNotification 添加观察者,则会收到这些。
还要注意NSViewController 子类是表视图的委托和数据源明确符合<NSTableViewDelegate> 和<NSTableViewDataSource>,所以不应该有任何理由让表视图混淆什么委托方法已实现。
【问题讨论】:
标签: objective-c cocoa nstableview nspanel