【问题标题】:Best way to customize how core data populate NSArrayController自定义核心数据如何填充 NSArrayController 的最佳方式
【发布时间】:2012-06-16 17:13:10
【问题描述】:

到目前为止,我能找到的所有示例都是 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 绑定。

最好的方法是什么?谢谢。

【问题讨论】:

    标签: objective-c cocoa core-data nsarraycontroller


    【解决方案1】:

    轻松获得UserName 属性(FirstName + LastName)的一种方法是使用UserName 方法在SystemUser 类上定义一个类别,该方法返回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;
    

    【讨论】:

    • 谢谢!为此,我在 SystemUser 类中添加了另一个字段,并通过 NSManagedObject 的 willSave() 方法更新了 fullName 字段。但我认为你的方法是更好的方法。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多