我的模型中有两个对象:Person和Address。人有一个关键的名字,与地址和地址的关系有一条关键的街道。
我设计了用户界面来显示一个包含一列(Person.name)的表和两个包含name和street的文本字段。
我创建了一个带有managedObjectContext集的NSArrayController,并将ObjectController设置为Entity和EntityName Person。
运行应用程序表格显示所有添加的人员。这两个文本字段通过Bindings选项卡连接到Person-ArrayController:
带有值的nameField: 绑定到:人员/控制器密钥:已选择/模型密钥路径:名称
streetField值: 绑定到:人员/控制器密钥:已选择/模型密钥路径:address.street
我能够将某些东西写入名称并持久存储。我也可以在streetField中输入内容,但不会存储。
有谁知道为什么?
答案 0 :(得分:1)
当数组控制器创建person对象时,会出现类似于以下代码的内容:
(假设moc是AppDelegate managedObjectContext,也假设Person是NSManangedObject的子类):
Person *personObj = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:moc];
personObj.name = @"something"; //some dummy values
[personObj.address setValue:@"dummy address" forKey:@"street"];
如果记录personObj.address
,将在控制台上打印nil。
这是因为personObj.address
是一个Address
对象,到目前为止尚未实例化。因此personObj.address.street
将为NULL
。
这也是你的情况。
如果您将上述代码更改为以下代码,它将正常工作。
Person *personObj = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:moc];
//create an Address object and assign it to personObj.address (setting the relationship)
personObj.address= [NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:moc];
personObj.name = @"something"; //some dummy values
[personObj.address setValue:@"dummy address" forKey:@"street"];
并且无法使用绑定完成此操作。
简而言之,绑定到streetField
的{{1}}没有获得任何值,因为address.street
未指向实例化对象。