macos - 如何连接 NSTableView/Table View 以避免运行时错误“无法连接操作,目标类 NSObject 不响应”)
问题描述
在基于视图的单列 NSTableView 中,其表格单元格视图中包含默认的 NSTextField,我试图通过将 .xib 的 Interface Builder 视图中的 NSTextField 的操作连接到我的方法中来收听已确认的用户编辑窗口的 ViewController。但是在运行时(在窗口初始化期间)我得到“无法连接操作,目标类 NSObject 不响应 -textCellChanged”。我不明白哪个 NSObject 被错误地定位,并且我在窗口中有许多其他 NSView 正确连接到同一个 WindowController 中的其他插座和操作。
我看到其他各种具有类似症状的帖子,通常也在 NSTableView 的上下文中,并且在我的上下文中探索了这些其他问题的解决方案或部分解决方案,但没有成功。我忽略了在 Interface Builder 中连接 Table View Cells 有什么特别的魔力吗?或者换一种说法:目标对象是如何在运行时实际确定的,当操作只是文件所有者中的一个类方法时(并且对于所有连接到公共超级视图的同一所有者的不同控件,这何时会有所不同)?
以下是上下文的一些细节:
- File Owner 设置为 NSWindowController 的子类,并且 Module 正确继承到我的应用程序目标。
- 可能相关:我没有使用 Storyboard,我的 XIB 大纲视图层次结构中的顶级对象是一个窗口(NSPanel),而不是一个视图或视图控制器。NSWindowController 仅作为文件所有者出现在 XIB 中(不在大纲视图中作为其自己的对象)。
- 在我尝试过的任何各种接线场景中(以下),Interface Builder“看起来”接线操作已经成功。连接后,文件所有者的连接检查器在 Received Actions ("textCellChanged: ... [x] Table View Cell") 下列出了预期的连接,以及将 NSTableView 超级视图中的组件连接到 NSViewController 中的其他方法的许多其他操作。
- 同样,在同一个 NSViewController 中将 NSTextField 作为 OUTLET 连接也没有问题。只有动作(或目标/动作??在 IB 中只设置“动作”)失败。
- File Owner 也是 NSTableView 的数据源和委托,NSTextField 设置为 Action:Send on End of Editing 和 Behavior:Editable。我认为这些都与特定症状无关,这只是无法连接动作。
- NSWindowController 是 Swift;我尝试在主 NSWindowController 实现或在实现 NSTableViewDelegate 的扩展中实现适当的操作,但效果没有明显不同。
尽管在旧版本的 Xcode 中(我在 10.2 中),其他帖子都暗示了 Xcode 接线中的错误。以下是我尝试过的各种方法,结果都相似:
- Ctrl+Drag 从 IB Outline View 中的 Table View Cell 图标到 NSWindowController 源模块,定位到现有的 @IBAction 或允许 Xcode 生成新的连接(类型 Action,Object:File's Owner)并在 ViewController 中使用新方法
- 从@IBAction 旁边的源代码“左列单选圆圈”反向拖动到我的.xib 大纲视图中的表视图单元格
- Ctrl+从表格视图单元图标(在大纲视图中)拖动到占位符/文件所有者图标,然后从视图控制器中实现的方法的弹出列表中选择适当的操作方法。
- 可能还有其他一些
最后,这里有一些相关的帖子以及它们的不同之处:
这听起来像是一个相同的症状,但在评论中,OP 声称通过将文件所有者设置为视图控制器(完成)和解决阻止XCode 错误(在我的上下文中不可见)的组合来解决问题。
这表明我正在链接到过时(已删除)的方法;当我允许 Xcode 为我创建方法时,绝对不是这种情况。
这个未答复的帖子表明用户放弃了作为 IB 错误的情况,并放弃了优先选择非目标/操作解决方法。我想我可以追求收听 NSTextField 上的通知作为类似的解决方法。
最后,对于类似症状的公认答案是在这种情况下与文件所有者的连接不正确,其中文件所有者是 NSApplication 对象而不是视图控制器。在我的例子中,File Owner 是定义这些方法的 View Controller 对象,所以感觉是正确的目标。
这里有什么不为人知的吗?在此先感谢您的帮助。
解决方案
xib 文件中的文件所有者是一个占位符对象,表示 nib 的所有者并表示传递给makeView(withIdentifier:owner:)
. 将 nib 的所有者(通常是视图控制器或窗口控制器)传递给makeView(withIdentifier:owner:)
.
推荐阅读
- python-3.x - 使用 selenium 访问下一页
- json - 在 BigQuery 中存储 JSON
- python - 如何格式化以下文本?
- javascript - 为什么 Object.keys 在 ES2015 中更改为将原语强制转换为对象?
- python - 如何将 os.DirEntry 对象与 pandas read_csv() 一起使用?
- iis - 如何解决部署 .net 核心 Web API 时出现 404 错误
- javascript - 如何根据日期将数据从 gmail 发送到不同的工作表?
- reactjs - 调用 this.props.history.push 后如何进行组件更新?
- javascript - TypeError:使用 cloudinary 时无法读取未定义的属性“路径”
- javascript - IBM Watson WebSocket 连接失败。HTTP 认证失败;没有可用的有效凭证