如何有线连接NSTableView / Table View以避免运行时错误“无法连接操作,目标类NSObject不响应”)

时间:2019-03-26 07:24:59

标签: macos cocoa interface-builder

在基于视图的单列NSTableView的“表格单元格”视图中包含默认NSTextField的情况下,我试图通过将.xib的Interface Builder视图中的NSTextField的操作连接到窗口的ViewController中的方法。但是在运行时(在窗口初始化期间),我得到“无法连接操作,目标类NSObject不响应-textCellChanged”。我不明白哪个NSObject被错误地定位,并且窗口中还有许多其他NSView正确连接到同一WindowController中的其他出口和动作。

我还经常在NSTableView的上下文中看到各种具有类似症状的其他文章,并且在我的上下文中探索了针对其他问题的解决方案或部分解决方案,但没有成功。我在忽略Interface Builder中的Table View单元接线方面有什么特别的魔术吗?或用不同的措词表达: target 对象在运行时实际上是如何确定的,当 action 仅仅是文件所有者中的类方法时(以及何时针对不同的控件而有所不同)都连接到同一超级视图的同一所有者)?

以下是上下文的一些细节:

  • 文件所有者被设置为NSWindowController的子类,并且Module正确继承了我的应用程序目标。
  • 可能相关:我没有使用情节提要,而XIB的大纲视图层次结构中的顶级对象是一个Window(NSPanel),而不是View或View Controller。 NSWindowController仅在XIB中以文件所有者的形式出现(而不是在大纲视图中以其自己的对象出现)。
  • 在我尝试过的各种接线方案中(如下),Interface Builder看起来“好像”接线操作已经成功。接线后,文件所有者的连接检查器在“接收的动作”(“ textCellChanged:... [x]表视图单元”)下列出了预期的连接,以及将NSTableView的超级视图中的组件连接到NSViewController的其他方法的许多其他动作。 / li>
  • 同样,在同一NSViewController中将NSTextField作为OUTLET连接也可以正常工作。只是失败的动作(或IB中的目标/动作?仅设置了“动作”)。
  • 文件所有者还是NSTableView的数据源和委托,并且NSTextField设置为Action:Send on Editing and Behavior:Editable。我认为这些都不与特定症状相关,这只是连接动作失败。
  • NSWindowController是Swift;我尝试在主要的NSWindowController实现中或在实现NSTableViewDelegate的扩展中实现适当的动作,而没有明显的不同效果。

尽管在旧版本的Xcode中(我在10.2中),其他帖子还是暗示了Xcode的布线错误。这是我尝试过的各种方法,都具有相似的结果:

  • Ctrl +从IB大纲视图中的“表格视图”单元格图标拖动到NSWindowController源模块,在那里定位现有的@IBAction或允许Xcode生成新的Connection(类型为Action,Object:File's Owner),并带有一个新方法在ViewController中
  • 从源代码“左列单选圆圈”旁边的@IBAction反向拖动到我的.xib大纲视图中的表格视图单元格中
  • Ctrl +从表视图单元格图标(在大纲视图中)拖动到占位符/文件的所有者图标,然后从在视图控制器中实现的方法的弹出列表中选择适当的操作方法。
  • 可能还有一些

最后,这是一些相关文章以及它们之间的区别:

  • This听起来像是一个相同的症状,但在评论中,OP声称已通过将文件所有者设置为视图控制器(完成)并通过解决{{3} }(在我的上下文中不可见)。

  • XCode bugs建议我链接到一个过时的(已删除)方法;绝对不允许Xcode为我创建方法。

  • This建议用户放弃作为IB错误的情况,而放弃使用非目标/操作的解决方法。我想我可以寻求通过类似的解决方法来监听NSTextField上的通知。

  • 最后,对于类似症状This unanswered post的公认答案是,在这种情况下,与文件所有者的连接不正确,其中文件所有者是NSApplication对象而不是View Controller。就我而言,文件所有者是定义这些方法的View Controller对象,因此感觉像是正确的目标。

这里有没有石头?预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

xib文件中文件的所有者是一个占位符对象,代表笔尖的所有者,并代表传递给makeView(withIdentifier:owner:)的所有者对象。将笔尖的所有者(通常是视图控制器或窗口控制器)传递给makeView(withIdentifier:owner:)