Objective-C/Cocoa中的绑定与IBOutlets

JPC*_*JPC 3 cocoa objective-c iboutlet

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

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

@property (assign) NSString *letters;
Run Code Online (Sandbox Code Playgroud)

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

但是,这个例子也有:

@property (assign) IBOutlet NSArrayController *wordsController;
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Jos*_*ell 10

你混淆了绑定和IBOutlets.这不是不合理的 - 它是很多控制拖延连接,很难清楚发生了什么.让我试着解释一下:

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

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

这就是绑定的作用.它们是减少样板代码的一种方法.如果IBOutlet需要,数组控制器为您的对象提供了一种向阵列控制器发送消息的方法.您可能需要执行此操作的一个简单示例是允许菜单项触发阵列控制器中的方法; 文档对象或其他控制器可以处理菜单项中的操作,并在阵列控制器上调用相应的消息.您也可以要求阵列控制器arrangedObjects获取其内容数组的已排序和过滤版本.


*这里的一个注意事项是,您的NSString财产几乎肯定会使用retain,而不是assign.包含此变量的对象应该负责其内存.