NSOutlineView中的NSButton动作未被调用?

时间:2015-07-25 10:42:34

标签: objective-c macos cocoa nsoutlineview

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

现在这个大纲视图是基于视图的。

我在表格视图单元格中添加了2个按钮,并为它们分配了2个动作(正如通常那样)。

但是,单击按钮时,没有一个被调用。

发生了什么事?或者 - 更好的措辞 - 可以继续发生什么?

(这绝对令人惊讶 - 因为我必须完成类似的事情超过100万次......)

2 个答案:

答案 0 :(得分:3)

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

因此,您无法将操作,出口或绑定实际连接到列外的大多数对象。它基本上是IB中的一个错误,它甚至允许你这样做。加载子NIB以创建大纲视图的视图时,将无法正确恢复连接。

有几个例外。标准占位符在NIB中由特殊对象ID标识。如果将子NIB中的对象连接到占位符,则将连接记录为该特殊ID。当大纲视图加载子NIB时,实际上是与填充该占位符角色的对象建立连接。应用程序对象是明确的;它将是实际的应用程序对象。第一个响应者实际上是nil,因此继续工作。 iffy是文件所有者。

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

我不清楚你的大纲视图是在你的主要NIB或故事板中,如果没有,你所引用的AppDelegate可能是什么。但是,如果您将按钮的操作连接到不是标准占位符对象的列之外的任何内容,则在加载子NIB时将无法正确恢复连接。即使您连接到文件所有者,也可能会出现意外连接。

一些可能的解决方案:

  • 您可以实施-outlineView:viewForTableColumn:item:; 让它正常调用-makeViewWithIdentifier:owner:来获取视图;如果按钮不是单元格视图本身,请通过实际单元格视图或标签上的自定义插座找到它;并将其目标设置为所需对象(如self)。
  • 如果大纲视图的委托实际上是所需的目标,那么你可以利用它的古怪 文件的所有者。尽管如此,将您的按钮连接到文件所有者 看起来不是正确的目标,它实际上会在运行中运行 时间,因为大纲视图的委托通常被设置为子NIB的所有者。您可能需要做一些黑客以使IB允许该连接, 因为它不会认为文件所有者的类支持所需的操作方法。
  • 如果您正在使用容器视图作为轮廓单元格视图,例如 NSTableCellView,然后你可以将其子类化,实现一个动作 在它上面的方法,将你的按钮连接到那个,并采取该行动 方法前进到另一个对象。你必须找到 代码的最终目标,因为你无法连接任何插座 NSTableCellView比外面的物体更好 按钮的。
  • 另一种方法是使用绑定来连接按钮和 以某种方式去通过 NSTableCellView的{​​{1}}。或者通过 应用程序占位符,通过其objectValue属性。要么 类似的东西。

答案 1 :(得分:0)

我遇到了同样的问题。我将按钮目标更改为 Outlineview 而不是 AppDelegate。

转到:YourXIB--> 选择您的按钮--> 连接检查器--> 引用插座--> 将新引用插座拖到您的 OutlineView--> 选择“委托”