Objective c Can';t在服务应用程序的NSTableView中选择行
我简直要发疯了 我有一个服务应用程序,可以打开一个非常简单的Objective c Can';t在服务应用程序的NSTableView中选择行,objective-c,cocoa,nstableview,nspanel,Objective C,Cocoa,Nstableview,Nspanel,我简直要发疯了 我有一个服务应用程序,可以打开一个非常简单的NSPanel,它由一个NSTableView、一个标签和三个NSButton控件组成 就这样 表视图基于视图,在IB中定义了四个不同的NSTableCellView行 表格代码非常直接;myNSWindowController子类既是数据源又是委托。在大多数情况下,一切都很完美: 窗户开了 预期的数据源方法(numberOfRowsInTableView:和 tableView:objectValueForTableColumn:r
NSPanel
,它由一个NSTableView
、一个标签和三个NSButton
控件组成
就这样
表视图基于视图,在IB中定义了四个不同的NSTableCellView
行
表格代码非常直接;myNSWindowController
子类既是数据源又是委托。在大多数情况下,一切都很完美:
- 窗户开了
- 预期的数据源方法(
和numberOfRowsInTableView:
)被调用tableView:objectValueForTableColumn:row:
- 该表通过以下方式填充视图和节分隔符:
和tableView:isGroupRow:
tableView:viewfortable列:行:
- 空选择被禁用,因此代理会立即收到
message,表格将自动显示 选择第一行tableView:shouldSelectRow:
- 该表将按其应有的方式显示,并选中第一行
- 子类化
,并验证它正在接收NSTableCellView
调用hitTest:
- 尝试“黑”表单元格视图
,因此它总是返回hitTest:
nil
- 在表格单元格视图内的控件视图上尝试了“拒绝第一响应者”、“已启用”、“可编辑”属性的各种组合
- 已尝试删除所有控件视图。所以表单元格视图是空的
- 已尝试实施
而不是tableView:selectionIndexforProposedSelection:
tableView:shouldSelectRow:
- 将
更改为常规NSPanel
NSWindow
tableView:shouldSelectRow:
调用
请注意,窗口中的所有其他(NSButton
)控件工作正常。我可以点击其中任何一个
更新#1
根据评论,我尝试将产品更改为普通的旧.app
,但没有任何区别
我的下一步是进一步修改委托方法,并将问题缩小到:
- 如果我实现了
,表将调用我的委托方法两次(因为我已禁用“空选择”,表必须首先确定选择哪一行作为默认行,因此我将得到两个调用,一个用于行0(否),另一个用于行1(是))。但是,如果我在表格中单击,我将永远不会收到另一个tableView:shouldSelectRow:
表格视图:shouldSelectRow:
- 如果我删除了
的实现,表选择就会神奇地开始工作。(除了您可以选择“分组行”这一事实,它是worng。)tableView:shouldSelectRow:
- 还尝试实现了
,而不是tableView:selectionIndexforProposedSelection:
;同样的行为tableView:shouldSelectRow:
表视图:shouldSelectRow:
,则该表不可用。删除该方法,它将再次工作
更新#3
更奇怪的是:考虑到我可以“破解”行选择问题,我实现了表视图委托方法tableViewSelectionIsChanging:
和tableViewSelectionDidChange:
。两人都没有接到电话。即使我删除了tableView:shouldSelectRow:
,允许表选择工作,也不会收到任何tableView选择更改:
或tableView选择更改:
但是,如果我为nStableViewSelectionsChangingNotification
和NSTableViewSelectionDidChangeNotification
添加观察者,则会收到这些观察者
还要注意的是,作为表视图的委托和数据源的
NSViewController
子类明确地符合
和
,因此没有任何理由会混淆表视图实现了哪些委托方法。Yikes!现在这很尴尬
因此,问题在于对窗口控制器的引用较弱
下面是正在发生的事情:创建、加载窗口控制器,并显示窗口。在最初的演示和显示过程中,一切正常(tableView:shouldSelectRow:
等),因为存在窗口和视图控制器。但在未来的一些事件循环中,ARC破坏了窗口和视图控制器,只在屏幕上留下一个表视图窗口,对其委托和数据源对象的弱引用现在为零
解决方案是修复窗口控制器管理,以便在窗口关闭之前保持对窗口控制器的强引用
有时候最简单的事情会让你绊倒……是的,很好。你不是第一个让他的控制器不存在而让视图不起作用的人。。。