【问题标题】:Reverse Cocoa bindings and identify the bindings target view?反转 Cocoa 绑定并识别绑定目标视图?
【发布时间】:2012-06-07 18:57:47
【问题描述】:

我有一个公开NSString 属性的自定义类。在 Interface Builder 中,我已将 NSButtontitle 绑定到我的自定义类的属性。

是否可以从我的自定义类中获取对 NSButton 实例的引用?

本质上,我试图在我的自定义类中找到绑定到属性的所有用户界面元素。

【问题讨论】:

  • 我没有提供完整的解决方案,但我建议覆盖-addObserver:forKeyPath:options:context:。我认为您需要在绑定的控制器上执行此操作。
  • 你想要完成什么?也许还有另一种方法可以利用不同的绑定、视图子类或 KVO。
  • - (void *)observationInfo 也可能产生有用的信息,我不确定。
  • 不可能有唯一的答案,因为多个视图(或其他对象)可能绑定到同一个对象和属性。至于 noa 的建议,观察者可能是绑定到你的对象的视图,也可能是一些对你不透明的辅助对象。
  • 上面有很多好的建议。 Ken 是对的,所有方法都会产生一些未公开的内部帮助器/包装器类。例如NSKeyValueObservationInfoNSObjectParameterBinderNSKeyValueObservance。我想我可以为这些创建标题,但风险是接口将来会发生变化......

标签: cocoa cocoa-bindings


【解决方案1】:

总的来说,这听起来像是一种反模式和/或一个坏主意。也就是说,有几件事要记住。多个观察者可以绑定到您的财产。您可以覆盖addObserver:forKeyPath:options:context:removeObserver:forKeyPath:(和removeObserver:forKeyPath:context:),然后维护自己的观察者数组。使用这种方法,我会提醒您,您可能需要付出额外的努力才能使数组不保留观察者,因为传统上 KV 观察不会保留观察对象,如果您开始保留,您可能会遇到泄漏/堆增长将它们放在NSArray 中。

覆盖addObserver:...removeObserver:... 的另一个问题是,如果没有大量额外工作,您将不会知道观察是针对绑定还是针对其他内容(例如,依赖keyPath 通知)。一种可能的解决方法是通过infoForBinding: 在所有exposedBindings 上使用performSelector:afterDelay: 在稍后的runloop pass 上询问观察者。 (我想我只是因为提出这个建议而在嘴里吐了一点。)

依赖 KVO 系统的私有实现细节可能不是一个好方法,除非您的目标只是更好地了解 KVO 的工作原理,但听起来您实际上是在尝试完成某事。

真的,这整个方法就像是灾难的秘诀。这听起来像是从一开始就违反了 MVC。为什么模型对象需要知道视图对象?无论您在这里尝试完成什么,几乎肯定会通过让 nib 由 NSViewController 子类拥有更好地完成,该子类具有所有 UI 元素的 IBOutlets 和模型的属性。然后,该对象将能够更清晰地管理视图和模型对象之间明显复杂的关系,而无需运行时诡计。由于您没有详细说明这种诡计的最终目标,因此很难说最好的方法是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多