3

我正在通过一个简单的 Objective-C/Cocoa 程序来尝试学习该语言,并且对我编写的代码如何将某些内容链接到界面构建器感到有些困惑。

例如,我有一个简单的 NSString:

@property (assign) NSString *letters;

在我的界面构建器中,我有一个文本字段,我使用文本字段的绑定将其连接到字母。

然而,这个例子也有这个:

@property (assign) IBOutlet NSArrayController *wordsController;

在视图中,我有一个不断变化并显示不同单词的表,这些单词存储在 NSMutableArray 中。我想我可以理解我只是无法将数组绑定到表,因为还有一些更复杂的情况。因此,在 Interface Builder 中,我创建了一个 Array Controller 并将其绑定到表。在 Array Controller 的绑定中,我将 Array Controller 绑定到单词数组。

我知道我要做的最后一件事是将数组控制器也绑定到我的 NSArrayController 对象。我不明白为什么我通过主控制器对象通过在此插座和 wordsController 之间建立连接来执行此操作。在 Array Controller 的绑定部分有一个灰色的选项 Content Object,上面写着“NSArrayController 将其视为其内容的 NSArrayController”。为什么我不在这里设置绑定?它作为一个出口有什么意义,为什么它与我的 NSString 字母不同?

谢谢

4

1 回答 1

10

您混淆了绑定和 IBOutlets。这并不是不合理的——它需要大量的控制拖拽连接,而且很难弄清楚发生了什么。让我试着解释一下:

绑定是一种让 Cocoa 处理保持模型(一些数据集合,甚至像单个数据一样简单的东西NSString)和视图(显示在屏幕上的对象)同步的机制的方法。当您将您的“绑定”NSString到文本字段value时,您是在要求框架将更改传达给“幕后”的字符串或文本字段;当文本字段更改时,拥有字符串的对象会收到通知更改字符串的值,反之亦然。*

类似的情况适用于您的可变数组、数组控制器和表视图。对于复杂性,您基本上是正确的:可变数组和表格视图不知道如何相互交谈;数组控制器介于两者之间并促进:(“好吧,tableView 想知道在第i行中放入什么。数组,给我你在索引i处的对象。”:) 过去,您必须编写该代码手动,每次你这样做时看起来都非常相似。

这就是绑定的作用。它们是减少样板代码的一种方法。到数组控制器为您的对象提供了一种在IBOutlet必要时向数组控制器发送消息的方法。您可能需要这样做的一个简单示例是允许菜单项触发数组控制器中的方法;一个文档对象或另一个控制器可能会处理来自菜单项的操作,并在数组控制器上调用适当的消息。例如,您还可以要求数组控制器arrangedObjects获取其内容数组的排序和过滤版本。


* 这里的一个附注是,您的NSString财产几乎肯定应该使用retain,而不是assign。包含这个变量的对象应该负责它的内存。

于 2011-04-28T22:12:56.520 回答