Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Can';t在服务应用程序的NSTableView中选择行_Objective C_Cocoa_Nstableview_Nspanel - Fatal编程技术网

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

表格代码非常直接;my
NSWindowController
子类既是数据源又是委托。在大多数情况下,一切都很完美:

  • 窗户开了
  • 预期的数据源方法(
    numberOfRowsInTableView:
    tableView:objectValueForTableColumn:row:
    )被调用
  • 该表通过以下方式填充视图和节分隔符:
    tableView:isGroupRow:
    tableView:viewfortable列:行:
  • 空选择被禁用,因此代理会立即收到
    tableView:shouldSelectRow:
    message,表格将自动显示 选择第一行
  • 该表将按其应有的方式显示,并选中第一行
一切看起来都很完美,但我无法选择其他行。我在表格中单击任何内容都不会更改选择

我试过:

  • 子类化
    NSTableCellView
    ,并验证它正在接收
    hitTest:
    调用
  • 尝试“黑”表单元格视图
    hitTest:
    ,因此它总是返回
    nil
  • 在表格单元格视图内的控件视图上尝试了“拒绝第一响应者”、“已启用”、“可编辑”属性的各种组合
  • 已尝试删除所有控件视图。所以表单元格视图是空的
  • 已尝试实施
    tableView:selectionIndexforProposedSelection:
    而不是
    tableView:shouldSelectRow:
  • NSPanel
    更改为常规
    NSWindow
似乎没什么不同。我在表中单击任何内容都不会更改选择,并且我的表视图代理从未收到另一个
tableView:shouldSelectRow:
调用

请注意,窗口中的所有其他(
NSButton
)控件工作正常。我可以点击其中任何一个

更新#1

根据评论,我尝试将产品更改为普通的旧
.app
,但没有任何区别

我的下一步是进一步修改委托方法,并将问题缩小到:

  • 如果我实现了
    tableView:shouldSelectRow:
    ,表将调用我的委托方法两次(因为我已禁用“空选择”,表必须首先确定选择哪一行作为默认行,因此我将得到两个调用,一个用于行0(否),另一个用于行1(是))。但是,如果我在表格中单击,我将永远不会收到另一个
    表格视图:shouldSelectRow:

  • 如果我删除了
    tableView:shouldSelectRow:
    的实现,表选择就会神奇地开始工作。(除了您可以选择“分组行”这一事实,它是worng。)

  • 还尝试实现了
    tableView:selectionIndexforProposedSelection:
    ,而不是
    tableView:shouldSelectRow:
    ;同样的行为

因此,如果我实现任何委托方法来确定哪些行是可选择的,那么我就不能选择任何行。叹息

更新#2

我启动并重构了应用程序,因此现在有一个新的视图控制器对象专门用于管理表视图(而不是重载窗口控制器)。所有数据模型和委托方法都已移动到新的视图控制器

另外(考虑到IB中的表视图可能有些奇怪),我从NIB中删除了表视图,并重新创建了它和它的所有连接

不幸的是,这两个变化都没有产生任何影响。如果实现了
表视图:shouldSelectRow:
,则该表不可用。删除该方法,它将再次工作

更新#3

更奇怪的是:考虑到我可以“破解”行选择问题,我实现了表视图委托方法
tableViewSelectionIsChanging:
tableViewSelectionDidChange:
。两人都没有接到电话。即使我删除了
tableView:shouldSelectRow:
,允许表选择工作,也不会收到任何
tableView选择更改:
tableView选择更改:

但是,如果我为
nStableViewSelectionsChangingNotification
NSTableViewSelectionDidChangeNotification
添加观察者,则会收到这些观察者


还要注意的是,作为表视图的委托和数据源的
NSViewController
子类明确地符合
,因此没有任何理由会混淆表视图实现了哪些委托方法。

Yikes!现在这很尴尬

因此,问题在于对窗口控制器的引用较弱

下面是正在发生的事情:创建、加载窗口控制器,并显示窗口。在最初的演示和显示过程中,一切正常(
tableView:shouldSelectRow:
等),因为存在窗口和视图控制器。但在未来的一些事件循环中,ARC破坏了窗口和视图控制器,只在屏幕上留下一个表视图窗口,对其委托和数据源对象的弱引用现在为零

解决方案是修复窗口控制器管理,以便在窗口关闭之前保持对窗口控制器的强引用


有时候最简单的事情会让你绊倒……

是的,很好。你不是第一个让他的控制器不存在而让视图不起作用的人。。。