2012-06-13 54 views
2

到目前为止,我可以找到的所有示例都是Core Data和NSArrayController之间的直接绑定。这意味着每个NSArrayController只映射一个实体。定制核心数据填充方式的最佳方法NSArrayController

有没有办法自定义什么是填充到NSArrayController?

例如,我有两个实体:

FileMetaData 
    ID 
    FileName 
    FileSize 
    Owner(relationship m..1 to SystemUser) 

SystemUser 
    ID 
    FirstName 
    LastName 
    Files(relationship 1..m to FileMetaData) 

我有一个NSArrayController的填充有两个列的tableview,一个是“文件名”,另一种是“用户名”。 UserName来自SystemUser实体中的FirstName +姓氏。 NSArrayController设置为与FileMetaData绑定。

这样做的最好方法是什么?谢谢。

回答

1

的一种方法很容易地获得一个UserName属性(FirstName + LastName)是定义在SystemUser类的类别与UserName方法,该方法返回FirstNameLastName性质妥级联。

然后在您的各种绑定中,您可以绑定到UserName属性。直接输入到浏览器中,所以没有测试,一个UISupport(或任何其他名称)SystemUser类看起来是这样的:

// In SystemUser+UISupport.m 

- (NSString *)userName 
{ 
    return [NSString stringWithFormat: @"%@ %@", self.FirstName, self.LastName]; 
} 

为了如果FirstNameLastName属性更改绑定工作,你可能想要实现此方法,也:

+(NSSet*)keyPathsForValuesAffectingUserName 
{ 
    return [NSSet setWithObjects: @"self.FirstName", @"self.LastName", nil]; 
} 

最后,为了完整起见,你可以宣布你的新一届只读在头文件属性:

// In SystemUser+UISupport.h 

@property (readonly) NSString *userName; 
+0

谢谢!我在SystemUser类中添加了另一个字段,并通过NSManagedObject的willSave()方法更新了fullName字段。但我认为你的方式是一个更好的方法。 –

0

我认为Monolo的解决方案比我的解决方案更好,但只是替代方案,我也会发布我的解决方案。

我的方法是在SystemUser.m中添加一个新的“displayName”字段。并实现NSManagedObject的willSave()方法。

-(void)willSave 
{ 
    if (self.displayName == nil) 
    { 
     self.displayName = [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName]; 
    } 
} 

这样,在CoreData尝试保存实体之前,displayName字段被更新。

相关问题