我正在通过一个简单的Objective-C / Cocoa程序来尝试学习该语言,并且对于从我编写的代码到界面构建器的某些内容的链接方式感到有些困惑。
例如,我有一个简单的NSString:
@property (assign) NSString *letters;
在我的界面构建器中,我有一个文本字段,我使用文本字段的绑定将其连接到字母。
然而,这个例子也有:
@property (assign) IBOutlet NSArrayController *wordsController;
在视图中,我有一个表不断变化并显示不同的单词,这些单词存储在NSMutableArray中。我想我可以理解我不能将数组绑定到表中,因为有一些更复杂的问题。因此,在Interface Builder中,我创建了一个Array Controller并将其绑定到表中。在Array Controller的绑定中,我将Array Controller绑定到单词数组。
据我所知,我要做的最后一件事也是将Array Controller绑定到我的NSArrayController对象。我不明白为什么我通过主控制器对象通过在这个插座和wordsController之间建立连接来做到这一点。在Array Controller的绑定部分中,有一个灰色选项Content Object,它表示" NSArrayController将NSArrayController视为其内容。"为什么我不在这里设置绑定?它作为一个出口有什么意义,为什么它与我的NSString字母不同?
由于
答案 0 :(得分:10)
您正在混淆绑定和IBOutlet。这不是不合理的 - 它是很多控制拖延连接,很难清楚发生了什么。让我试着解释一下:
绑定是一种让Cocoa处理保持模型(某些数据集合,甚至像单个NSString
这样简单的东西)和视图(在屏幕上显示的对象)同步的机制的方法。当您将NSString
“绑定”到文本字段value
时,您要求框架将更改传递给字符串或文本字段“幕后”;拥有字符串的对象会在文本字段更改时通知更改字符串的值,反之亦然。*
类似的情况适用于您的可变数组,数组控制器和表视图。你基本上对复杂性是正确的:可变数组和表视图不知道如何相互通信;数组控制器介于两者之间并促进:(“好吧,tableView想要知道放在行中的内容 i 。数组,在索引 i 上给我你的对象。”: )在过去,你必须手动编写代码,每次这样做时它看起来都非常相似。
这就是绑定的作用。它们是减少样板代码的一种方法。如果需要,数组控制器的IBOutlet
为您的对象提供了一种向数组控制器发送消息的方法。您可能需要执行此操作的一个简单示例是允许菜单项触发阵列控制器中的方法;文档对象或其他控制器可以处理菜单项中的操作,并在阵列控制器上调用相应的消息。您也可以要求阵列控制器获取其arrangedObjects
,例如,获取其内容数组的已排序和过滤版本。
*此处的一个注意事项是,您的NSString
媒体资源几乎肯定会使用retain
,而不是assign
。包含此变量的对象应该负责其内存。