我有许多名为people
的相同对象,它们几乎只包含以下属性:
@property (strong) NSString* name;
我希望有一个面板,检查器样式,允许我编辑这些对象的属性。
到目前为止我一直这样做的方式是:
editedPeople
对象
方法如:-(void)setEditedPeople:(PeopleClass*)people
和
-(void)loadDataFromEditedPeopleObject
和
-(void)saveDataToEditedPeopleObject
拥有所有控件
窗口每个都发送一条-(void)dataDidChange:(id)sender
消息
用户改变一些数据的时间。基本上,loadDataFromEditedPeopleObject
会调用setEditedPeople:
,而saveDataToEditedPeopleObject
会调用dataDidChange
。
现在,我觉得如果不编写很多代码,这可能会失败。特别是,我想避免写loadDataFromEditedPeopleObject
和saveDataToEditedPeopleObject
。
所以我尝试将一个人物对象添加到我的笔尖,但是我无法将人物对象中的@property (strong) NSString* name;
连接到我放在窗口中的NSTextfield。
实现目标的正确方法是什么(只需设置一个新的人物对象并让它神奇地更新)?
答案 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
对象的名称。