我为什么要使用NSObjectController?

时间:2011-12-27 17:24:52

标签: macos cocoa binding cocoa-bindings

虽然我搜索了很多关于Cocoa Bindings的信息,但我仍然对我所获得的信息相对不满意。似乎这个话题对许多人来说有点麻烦,很多人只是避免这种模式,我认为不应该这样。

当然,看起来绑定有时候太复杂,或者设计的开销太多......

但是,我有一个非常直接和具体的问题:如果我可以直接建立绑定,为什么需要NSObjectController呢?

例如,代码:

[controller bind:@"contentObject" toObject:self withKeyPath:@"numberOfPieSlices" options:nil];

[slicesTextField bind:@"value" toObject:controller withKeyPath:@"content" options:nil];
[stepperControl bind:@"value" toObject:controller withKeyPath:@"content" options:nil];

与:

完全相同
[slicesTextField bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil];
    [stepperControl bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil];

在我的例子中,我们讨论的是所有事情都在发生的类的属性,所以我猜测NSObjectController需要的时候是:

  • 控制器的关键路径是对象,其他控件的绑定需要它的属性,而不是它的值,就像它们的原语和它们周围的包装一样(我的情况下是numberOfPiesSlices是NSInteger)

    < / LI>
  • 或当需要从其他外部对象进行绑定时,不仅要在一个对象之间进行绑定

有人可以确认或拒绝吗?

2 个答案:

答案 0 :(得分:10)

绑定的好处之一是消除代码。为此,NSObjectController等具有以下优点:它们可以直接在界面构建器中使用,并通过绑定到各种UI元素进行设置。

绑定仅代表提供的部分功能。 * ObjectController类还可以自动处理应用程序通常需要的许多其他更重复的控制器(如模型,视图,控制器)代码。例如,他们可以:

  • 连接到核心数据存储并执行必要的提取,插入和删除
  • 管理撤消/重做堆栈
  • 选择已编辑但未提交的更改到您的UI并保存它们(例如,如果窗口关闭而焦点仍在编辑的文本字段上 - 这对我来说是新的,我从mmalc的回答中找到了它下面)。

如果你没有这样做,那么可能值得使用NSObjectController。它的子类(NSArrayController等)更有用。

另请参阅here,了解您的确切问题!

答案 1 :(得分:4)

  

如果我可以直接建立绑定,为什么需要NSObjectController呢?

我几天前在寻找有关NSObjectController的一些信息时阅读了这个问题,今天在继续我的搜索时,我发现the following passage似乎与这个问题有关:

  

如果对象被绑定到实现,则会有好处   NSEditorRegistration。这就是为什么绑定是一个好主意的原因之一   到控制器对象而不是直接绑定到模型。   NSEditorRegistration让绑定告诉控制器它的   内容正在编辑过程中。控制器跟踪   其中的视图当前正在编辑控制器的内容。如果   用户关闭窗口,例如,与之关联的每个控制器   该窗口可以告诉所有这些视图立即提交他们的   待编辑,因此用户不会丢失任何数据。 Apple提供一些通用控制器对象(NSObjectController,   NSArrayController,NSTreeController),可以用来包装你的   模型对象,提供编辑器注册功能。

     

使用   控制器还具有绑定系统不具有的优点   直接观察模型对象 - 所以如果你替换你的模型   具有新对象的对象(例如在用户具有的详细视图中)   改变了正在检查的记录),你可以直接替换   控制器内部的模型对象,KVO通知和绑定   更新。