gpt4 book ai didi

objective-c - NSOutlineView 中的 NSButton 操作未被调用?

转载 作者:行者123 更新时间:2023-12-03 17:31:16 24 4
gpt4 key购买 nike

好的,所以我有一个 NSOutlineView (通过 NSTreeController 填充)。

现在这个大纲 View 是基于 View 的。

我在 TableView 单元格内添加了 2 个按钮,并为它们分配了 2 个操作(就像通常所做的那样)。

但是,当我单击按钮时,它们都没有被调用。

这是怎么回事?或者 - 更好的措辞 - 可能发生了什么?

<小时/>

(这绝对是一个惊喜 - 因为我一定已经做过类似的事情超过 100 万次......)

最佳答案

问题在于基于 View 的大纲 View 中的单元格 View 实际上位于子 NIB 中。这在 IB 中没有显示,但列内的 View 层次结构本身就是一个 NIB。它被归档到一个 blob 中,并嵌入到包含大纲 View 的 NIB 中。

因此,您无法真正将操作、导出或绑定(bind)连接到列外部的大多数对象。这基本上是 IB 中的一个错误,它甚至允许你这样做。当加载子 NIB 来为大纲 View 创建 View 时,连接将无法正确恢复。

有一些异常(exception)。标准占位符在 NIB 中通过特殊对象 ID 进行标识。如果将子 NIB 中的对象连接到占位符,则该连接将被记录为与该特殊 ID 的连接。当大纲 View 加载子 NIB 时,实际上会与填充该占位符角色的对象建立连接。应用对象明确;它将是实际的应用程序对象。第一个响应者实际上是nil,因此可以继续工作。不确定的是文件的所有者。

您可能认为文件所有者就是指定为外部 NIB 所有者的任何内容,但事实并非如此。加载子 NIB 时,大纲 View 将调用委托(delegate)方法 -outlineView:viewForTableColumn:item:。通常会在大纲 View 上调用 -makeViewWithIdentifier:owner: 。作为该调用的第二个参数传递的所有者是子 NIB 的文件所有者。 (如果委托(delegate)未实现 -outlineView:viewForTableColumn:item:,大纲 View 会将其委托(delegate)作为所有者传递。)

我不清楚您的大纲 View 是否在您的主 NIB 或 Storyboard 中,或者如果不是,您所指的 AppDelegate 可能是什么。但是,如果您将按钮的操作连接到列之外的任何非标准占位符对象,则加载子 NIB 时将无法正确恢复连接。即使您连接到文件所有者,也可能会获得意外的连接。

一些可能的解决方案:

  • 您可以实现-outlineView:viewForTableColumn:item:;让它正常调用 -makeViewWithIdentifier:owner: 来获取 View ;如果按钮不是单元格 View 本身,请通过实际单元格 View 或标签上的自定义导出找到它;并将其目标设置为所需的对象(例如 self)。
  • 如果大纲 View 的委托(delegate)实际上是所需的目标,那么您可以利用这个奇怪之处文件的所有者。将您的按钮连接到文件所有者,即使这样看起来不是正确的目标,但它实际上会在运行时起作用因为大纲 View 的委托(delegate)通常被设置为子 NIB 的所有者。您可能需要进行一些修改才能使 IB 允许该连接,因为它不会认为 File's Owner 类支持所需的操作方法。
  • 如果您使用容器 View 作为大纲单元格 View ,例如NSTableCellView,然后您可以对其进行子类化,实现一个操作方法,将按钮连接到该方法,然后执行该操作方法转发到另一个对象。你必须找到代码中的最终目标,因为您无法连接任何 socket NSTableCellView 比你能更好地连接到外部对象按钮的。
  • 另一种方法是使用绑定(bind)来连接按钮和以某种方式遍历 NSTableCellViewobjectValue。或者通过应用程序占位符,通过其 delegate 属性。或者类似的事情。

关于objective-c - NSOutlineView 中的 NSButton 操作未被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31625606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com