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

问题描述 投票:0回答:1

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

我看到其他各种类似症状的帖子,通常也是在NSTableView的上下文中,并且在我的上下文中探索了解决方案或部分解决其他问题而没有成功。关于在Interface Builder中连接Table View Cells我有什么特别的魔力吗?或者用不同的方式表达:目标对象在运行时是如何实际确定的,当动作只是文件所有者中的类方法时(对于不同的控件,所有这些都连接到公共超级视图的同一所有者时)?

以下是一些背景细节:

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

其他帖子建议Xcode在布线中出现错误,不过在Xcode的旧版本中(我在10.2)。以下是我尝试过的各种方法,都有类似的结果:

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

最后,这里有一些相关的帖子以及它们的区别:

  • This听起来像一个相同的症状,但在评论中OP声称通过将文件所有者设置为视图控制器(完成)并通过解决阻止XCode bugs(在我的上下文中不可见)的组合来解决问题。
  • This建议我链接到陈旧(删除)的方法;绝对不是我允许Xcode为我创建方法的情况。
  • This unanswered post建议用户放弃作为IB错误的情况,并放弃优先考虑非目标/行动解决方案。我想我可以继续在NSTextField上收听通知作为类似的解决方法。
  • 最后,对类似症状here的接受答案是,在这种情况下,与文件所有者的连接不正确,其中文件所有者是NSApplication对象而不是视图控制器。在我的例子中,文件所有者是定义这些方法的View Controller对象,因此感觉就像正确的目标。

在这里任何一块石头?在此先感谢您的帮助。

macos cocoa interface-builder
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.