类似Inspector的数据对象绑定

时间:2014-08-23 20:11:14

标签: cocoa binding cocoa-bindings

我有许多名为people的相同对象,它们几乎只包含以下属性:

@property (strong) NSString* name;

我希望有一个面板,检查器样式,允许我编辑这些对象的属性。

到目前为止我一直这样做的方式是:

  1. 让窗口控制器拥有一个editedPeople对象 方法如:-(void)setEditedPeople:(PeopleClass*)people-(void)loadDataFromEditedPeopleObject-(void)saveDataToEditedPeopleObject拥有所有控件 窗口每个都发送一条-(void)dataDidChange:(id)sender消息 用户改变一些数据的时间。
  2. 基本上,loadDataFromEditedPeopleObject会调用setEditedPeople:,而saveDataToEditedPeopleObject会调用dataDidChange

    现在,我觉得如果不编写很多代码,这可能会失败。特别是,我想避免写loadDataFromEditedPeopleObjectsaveDataToEditedPeopleObject

    所以我尝试将一个人物对象添加到我的笔尖,但是我无法将人物对象中的@property (strong) NSString* name;连接到我放在窗口中的NSTextfield。

    实现目标的正确方法是什么(只需设置一个新的人物对象并让它神奇地更新)?

1 个答案:

答案 0 :(得分:0)

是的,这听起来像是绑定的好选择。

让我们从你的控制器上有一个单一的一对一关系属性的情况开始(与模型的一部分有关):

@property (strong) Person* person;

然后,您可以将视图绑定到控制器的此属性的属性。例如,窗口控制器通常是窗口NIB的文件所有者。所以,你可以绑定"值"使用模型键路径" person.name"将文本字段绑定到文件所有者。

完成此操作后,文本字段将显示控制器name属性的person属性中的值。如果编辑文本字段中的值,则将为控制器的name属性的person属性设置新值。因此,编辑将或多或少地自动更新Person对象。

如果更改控制器的person属性以使其引用不同的Person对象,则所有绑定视图都将跟踪该更改并自行更新。您必须小心,只能以符合键值观察的方式更新person属性。 (绑定建立在键值编码和键值观察之上。)符合KVO的最简单方法是始终使用setter方法来修改属性。因此,请在控制器上调用-setPerson:或分配给controller.person,但不要直接修改支持person属性的实例变量。

现在,你的问题提到了#34;人物",这是复数,但你并不清楚你实际意味着什么。如果您的控制器具有称为" people"的多对多关系属性,那么它通常是一个数组。在这种情况下,数组的内容通常会显示在表视图或集合视图中。每个元素都会显示相应Person对象的某些属性,并且可能在表或集合中可编辑。您可能还有一个详细信息视图,其中显示了所选项目的更多属性,并允许对其进行编辑。

在这种情况下,您将向NIB添加一个数组控制器(NSArrayController)实例。你绑定了阵列控制器"内容数组"使用模型键路径" people"绑定到文件所有者。然后,您将绑定表格或集合视图的内容"绑定到数组控制器,使用控制器键" arrangeObjects"。您还可以绑定表或集合视图" selectionIndexes"绑定到数组控制器,使用控制器键" selectionIndexes"。

对于具有基于NSTableCellView的单元格视图的基于视图的表视图,单元格视图的objectValue属性将自动设置为关联的Person对象窗口控制器的people数组。然后,单元格视图中的单个子视图(例如文本字段)应绑定到单元格视图,模型关键路径以objectValue.开头,例如objectValue.name

对于集合视图,每个Person将由NSCollectionViewItem的实例表示。该类的原型实例将在NIB中。每个集合视图项都有一个关联的视图,以显示特定的Person。每个集合视图项还将representedObject设置为Person数组中的特定people对象。视图和子视图可以绑定到集合视图项,模型键路径以representedObject.开头,例如representedObject.name

对于详细视图,子视图将绑定到数组控制器,控制器键"选择",模型键路径,命名该子视图显示并允许编辑的属性。例如,文本字段"值"绑定可能绑定到数组控制器,控制器键"选择",模型键路径" name"显示/编辑在表或集合视图中选择的Person对象的名称。