NSArrayController 子类添加 Core Data 对象需要啥?

Posted

技术标签:

【中文标题】NSArrayController 子类添加 Core Data 对象需要啥?【英文标题】:What does it take for NSArrayController subclass to add Core Data objects?NSArrayController 子类添加 Core Data 对象需要什么? 【发布时间】:2016-08-23 17:08:25 【问题描述】:

背景:我构建了一个没有经验的应用。它使用绑定、NSArrayController 子类和 Core Data/iCloud。经验水平导致大量代码不必要的编写,但应用程序运行正常。链接到 NSArrayController add: 方法的按钮触发了 newObjectaddObject:。删除从未奏效,让我查看了 contentArray binding 。一周前,我开始清理应用程序以更彻底地使用绑定的简单性。 (不幸的是,复杂性也进入了这个问题。)

假设: 1) add:remove: 方法会自动触发创建和删除对象的方法。许多简单的教程似乎都以这种方式工作。 2) add:addObject:remove:removeObject: 方法不需要被覆盖。

问题:addObject:removeObject: 不会被调用(在某些更改之后),除非在 add:remove: 方法中显式调用它们。我从来没有通过简单地单击删除按钮来删除数组控制器和托管对象的功能。

问题:添加和删除 Core Data 托管对象需要什么?

其他信息:下图中的阵列控制器已将自定义类设置为 CheckinArrayController。 Core Data 堆栈在 AppDelegate 中初始化。 newObject 方法已被覆盖以预设一些属性。

编辑:在数组控制器子类 add:newObjectaddObject:arrangeObjects: 中覆盖

数组控制器中的代码(NSArrayController 子类)

@implementation CheckinArrayController

- (id)newObject 
    id newObject = [super newObject];
    //  do object set up here ....
    return newObject;


- (void)add:(id)sender 
    /*  without the next 2 no object is added, although this is called
        NSManagedObject *newItem = [self newObject];
       [self addObject:newItem];    */


- (void)addObject:(id)object 
    [super addObject:object];


- (void)remove:(id)sender 
    [super remove:sender];


- (void)removeObject:(id)object 
    [super removeObject:object];


@end

当前阵列控制器连接:

【问题讨论】:

您是否将阵列控制器置于实体模式? 是的。使用实体名称“Checkin”(来自数据模型)并检查 Prepares Content。 顺便说一句,如果将表格视图的Selection Indexes 绑定到数组控制器,则可以将按钮的enabled 绑定到数组控制器的canRemove。添加按钮和canAdd 相同。 你重写了哪些方法? @Willeke 查看对 OP 的编辑。 【参考方案1】:

我建议在您的 ManagedObject 类中创建一个方便的 init。这是另一个概述了这一点的 SO 问题:

Designated Init for Managed Object

当你想创建一个新的托管对象时调用这个 init 方法。您的 arraycontroller 具有来自您设置的绑定的 managedObjectContext。

我是这样使用的:

let entity = NSEntityDescription.entity(forEntityName: "yourEntityName", in: managedObjectContext!)
let object = YourManagedObjectClassName(property1: "property1 entity: entity!, insertIntoManagedObjectContext: managedObjectContext)

我使用 NSArrayController 基类中的常用 removeObject 方法来删​​除对象。

removeObject Documentation

【讨论】:

以上是关于NSArrayController 子类添加 Core Data 对象需要啥?的主要内容,如果未能解决你的问题,请参考以下文章

绑定到 NSArrayController 的 core-plot 条形图

Mac OSX应用程序:与NSArrayController相关的问题NSTableView核心数据添加记录

NSArrayController 返回 null

Mac OSX 应用程序:与 NSArrayController NSTableView 核心数据添加记录相关的问题

NSArrayController 的奇怪行为

NSTableView 绑定到 NSArrayController