2

到目前为止,我能找到的所有示例都是 Core Data 和 NSArrayController 之间的直接绑定。这意味着每个 NSArrayController 都映射一个实体。

有没有办法自定义填充到 NSArrayController 中的内容?

例如,我有两个实体:

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

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

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

做这个的最好方式是什么?谢谢。

4

2 回答 2

1

轻松获取UserName属性 ( FirstName+ )的一种方法是LastName在类上定义一个类别,该方法返回适当连接的和属性。SystemUserUserNameFirstNameLastName

然后在您的各种绑定中,您可以绑定到该UserName属性。直接在浏览器中输入,因此未经测试,UISupport(或任何其他名称)类别SystemUser可能如下所示:

// In SystemUser+UISupport.m

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

FirstName如果or属性发生变化,为了使绑定工作LastName,您可能也希望实现此方法:

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

最后,为了完整起见,您可以在头文件中声明新的只读属性:

// In SystemUser+UISupport.h

@property (readonly) NSString *userName;
于 2012-06-13T20:21:22.380 回答
0

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

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

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

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

于 2012-06-14T12:38:38.010 回答