在Xcode 4中使用核心数据和绑定对密钥路径进行建模

在Xcode 4中使用核心数据和绑定对密钥路径进行建模,xcode,core-data,binding,Xcode,Core Data,Binding,我的模型中有两个对象:Person和Address。此人有一个关键姓名和地址关系,地址有一个关键街道 我已经设计了一个用户界面来显示一个包含一列(Person.name)和两个包含name和street的文本字段的表 我已经创建了一个NSArrayController,其中managedObjectContext集和ObjectController集为Entity和EntityName Person 运行应用程序时,该表将显示所有添加的人员。这两个文本字段通过绑定选项卡连接到Person Arr

我的模型中有两个对象:Person和Address。此人有一个关键姓名和地址关系,地址有一个关键街道

我已经设计了一个用户界面来显示一个包含一列(Person.name)和两个包含name和street的文本字段的表

我已经创建了一个NSArrayController,其中managedObjectContext集和ObjectController集为Entity和EntityName Person

运行应用程序时,该表将显示所有添加的人员。这两个文本字段通过绑定选项卡连接到Person ArrayController:

具有值的名称字段: 绑定到:个人/控制器密钥:选定/模型密钥路径:名称

有价值的街景: 绑定到:个人/控制器密钥:选定/型号密钥路径:address.street

我能够将某些东西写入名称中,并将其永久存储。我也可以将一些东西输入streetField,但它没有被存储


有人知道为什么吗???

当数组控制器创建person对象时,会发生类似于以下代码的情况:
(假设moc是AppDelegate managedObjectContext,也假设Person是NSManangedObject的子类):

如果记录了
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
绑定到
address。street
没有得到任何值,因为
address
没有指向实例化的对象

没有足够的信息来解决这个问题。你描述它的方式应该是有效的。我也这么认为。但是在一个scratch项目中尝试一下,你会发现它不起作用。你能以某种方式将street字段绑定到
地址吗?
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"];