为 NSManagedObject 子类的属性构建灵活的编辑表单

Posted

技术标签:

【中文标题】为 NSManagedObject 子类的属性构建灵活的编辑表单【英文标题】:Building a flexible editing form for attributes of an NSManagedObject subclass 【发布时间】:2013-08-09 22:33:13 【问题描述】:

我有一个具有 30 个不同属性的 NSManagedObject 子类。在应用程序中,用户应该能够编辑(大部分)表格中的属性。有 3 个属性会根据其他属性组合的值自动设置。

例子:

@implementation myNSManagedObjectSubclass
@dynamic one; // edited by user in form
@dynamic two; // edited by user in form
@dynamic three; // edited by user in form
@dynamic four; // edited by user in form
@dynamic five; // edited by user in form
@dynamic icon; // automatically set based values of above 5 items
@end

我有两个问题:

1) 关于在表格视图中构建一个用户可以用来编辑对象的表单:除了硬编码表格视图的内容,我怎样才能让我的表格视图仅为需要显示的属性构建单元格?我目前的想法是使用this method 来遍历我的对象的所有属性,并有一个二进制“显示掩码”,表格视图可以使用它来确定它是否应该为特定项目显示一个单元格。有没有更好的办法?

2) 关于根据其他属性的值自动设置一个属性:如何?我认为 KVO 在这里发挥了作用(我需要图标属性在它依赖的属性之一发生更改时立即在屏幕上更新)但我是 Core Data 的新手,我不确定我是否可以添加 KVO到 NSManagedObject 子类。

【问题讨论】:

【参考方案1】:

广告二 - 我同意 Wain 的观点,即 KVO 很有用。但是,另一种标准方法是覆盖自定义托管对象类中的设置器。

广告一 - 遍历属性看起来像是一个很好的抽象,但我怀疑它会为您节省任何工作。正如您所指出的,您仍然必须创建一个“二进制显示掩码”来确定要使哪个属性可编辑。一旦在某处添加了一个属性,这似乎很混乱......

我在这种情况下(40 个实体,100 个属性)有一个很好的经验,有一个可以用于此目的的简单“映射”plist。将属性输入到 plist 中(以所需的顺序)并添加其他属性确实非常快速和简单 - 如果发生变化,一个灵活的解决方案。

您仍然可以通过 NSEntityDescription 遍历属性以生成您的初始 plist。

【讨论】:

哦,伙计...我怎么能不考虑压倒二传手?这太简单了。谢谢你。您能否详细说明 plist 解决方案? Plist:实体名称字典,具有一个或多个附加信息的属性数组。我们用它来翻译例如JSON 对象到现有数据结构中。通过这种方式,您可以很容易地设置任何属性的顺序和“可编辑”。【参考方案2】:

对于 2,是的,KVO 可以帮助您解决这个问题。当对象从 fetch 唤醒以及观察到的属性发生变化时,该属性通常也是瞬态的并更新。

对于1,考虑使用NSEntityDescription,具体是attributesByName这样可以自动获取表格显示内容(如果要显示内名)和属性信息(这样就不会显示瞬态(派生的)属性)。

【讨论】:

以上是关于为 NSManagedObject 子类的属性构建灵活的编辑表单的主要内容,如果未能解决你的问题,请参考以下文章

无法创建 NSManagedObject 子类

具有未在模型中定义的附加属性的 NSManagedObject 子类

NSManagedObject 子类属性

Xcode NSManagedObject 子类在它们被标记为非可选时包含可选

将 NSManagedObject 转换为子类类型的问题

我可以向 NSManagedObject 的子类的子类添加属性吗?