【问题标题】:Custom NSPopUpButtonCell outlet / bindings自定义 NSPopUpButton Cell 出口/绑定
【发布时间】:2012-11-19 18:45:13
【问题描述】:

我在通过绑定和NSArrayController 填充表视图时实例化的表中的自定义NSPopUpButtonCell 遇到问题。

创建了弹出式按钮单元,但是当尝试通过覆盖弹出式按钮单元的setMenuItem:item 方法访问插座时,它是nil。
这是预期的行为吗..?
是否应该在创建时使用其他方法来替换菜单?

基本上,我需要插座链接回该文档窗口的控制器 (NSWindowController),以便在填充时从自定义弹出按钮相应地自定义 NSPopUpButtonCell 菜单。

使用绑定的解决方案会更好 - 但是当覆盖 setObjectValue: 时,我可以看到它永远不会使用 nil 参数调用.. 使用股票 NSPopUpButtonCell 会导致正确填充的弹出菜单。
(另见Why is NSPopUpButtonCell showing correctly when only setObjectValue:nil is called)。

【问题讨论】:

  • 您的弹出按钮的菜单是否也由绑定填充?如果是这样,那么您不会通过插座来更新它,而是通过更新它所绑定的数组来更新它。
  • 它是 - 但setObjectValue: 永远不会使用有效内容调用,它始终是nil(另请参阅Why is NSPopUpButtonCell showing correctly when only setObjectValue:nil is called)。那么如何从NSPopUpButtonCell.. 中获取绑定值?
  • 也许我不理解你的情况——我真的不知道你从弹出按钮单元格中获取值是什么意思。这些值来自一个数组,因此您应该从那里获取值。如果您能提供更多关于您正在尝试做的事情的详细信息,那将会很有帮助。
  • 问题改写 - 我想问题是如何使用绑定填充弹出按钮单元格,即我们需要覆盖什么。

标签: objective-c cocoa cocoa-bindings nspopupbuttoncell


【解决方案1】:

您无需重写任何内容即可在 NSTableView 列中填充 NSPopUpButtonCell。要知道的是您在 NSTableColumn 上而不是在单元格本身上设置绑定。通常,您的 xib 中有一个 NSArrayController 绑定到包含弹出窗口的所有选项的 NSArray,然后您将选择带有弹出单元格的列并转到 it's绑定。就像在这个屏幕截图中一样(注意右侧检查器中填充的内容、内容对象和选定对象绑定):

如果您想要一个工作示例,您可以查看 this project 我为另一个 StackOverflow 问题准备的。有一堆不相关的东西与使 NSPopUpButtonCell 使用 NSAttributedStrings 有关,但 xib 中的绑定构成了如何将 NSTableColumn 与弹出窗口绑定的工作示例,该弹出窗口的选项由绑定填充。

【讨论】:

  • 感谢您的样品。但是,我专门寻找一种方法来访问从其子类绑定到NSPopUpButton 的值并对其进行处理。
  • 如何做到这一点取决于你所说的价值观。如果您的意思是弹出菜单时出现在菜单中的选项,最简单的方法可能是制作菜单的委托并实现 NSMenuDelegate 方法menuNeedsUpdate:。如果您需要与当前选择的内容绑定的值,那有点麻烦,但是覆盖 `-[NSPopUpButtonCell setMenuItem:] 将使您有机会拦截单元格用于呈现其非弹出的从属菜单项向上状态。
  • 对 - 我猜menuNeedsUpdate: 足以满足我的目标!让我感到奇怪的是,我不能只使用覆盖 setObjectValue: 并将数组控制器将 "feed" 放入弹出菜单的所有对象..
  • 是的,Cocoa Bindings 并不总是像人们想象的那样工作。可悲的是,源不是公开的,并且文档没有写到理解这些细节所必需的详细程度。这往往会让我们将“繁琐的试错实验”作为主要资源。
  • 完全 - 对于现代 Cocoa 架构的支柱而言,Bindings 的文档水平只是可怕
猜你喜欢
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2011-11-01
  • 1970-01-01
相关资源
最近更新 更多