如何将 NSArray 和 NSArrayController 与 Core Data 一起使用?

Posted

技术标签:

【中文标题】如何将 NSArray 和 NSArrayController 与 Core Data 一起使用?【英文标题】:How can I use an NSArray and NSArrayController with Core Data? 【发布时间】:2009-06-21 07:31:18 【问题描述】:

我有一些代码需要访问 NSArray 才能工作。我有一个与 Core Data 一起使用的 NSArray,其中会有数据,但我不确定如何让我的 NSArrayController 访问 NSArray。

我不能像这样简单地在头文件中声明它:NSArray *objectArray;,因为它不知道如何访问或访问哪个NSArray。我将如何访问与 Core Data 一起使用的 NSArray?

我的头文件:

#import <Cocoa/Cocoa.h>


@interface MyOutlineView : NSOutlineView 
    NSArrayController* objectArray;


@end

我的实施文件:

#import "MyOutlineView.h"

@implementation MyOutlineView

- (void) outlineView: (NSOutlineView *) aView
     willDisplayCell: (id) aCell
      forTableColumn: (NSTableColumn *)aColumn
                item: (id) anItem

    id rootObj = anItem;
    unsigned row = [aView rowForItem:anItem];

    [aCell setDrawsBackground: YES];

    while ([aView levelForRow:row] != 0) 
        row --;
        rootObj = [aView itemAtRow:row];
    

    // The colours here are foul and ugly.  Use something else, for
    // God's sake!
    if( [objectArray indexOfObject:rootObj] % 2 )
        [aCell setBackgroundColor: [NSColor yellowColor]];
    else
        [aCell setBackgroundColor: [NSColor blueColor]];


@end

【问题讨论】:

您以何种方式将 NSArray 与 Core Data 结合使用?是否要将 Core Data 对象提取到 NSArray 对象中? 我正在使用 NSArray 来存储大纲视图中的文本。我有一些代码可以使大纲视图中的根对象具有不同的背景颜色。但它需要访问 NSArray 以确定哪个是根对象。 现在什么对象持有 NSArray?你的 Nib 中有一个 NSArrayController 来控制 NSArray 吗?这可能是有道理的,这样其他对象就会绑定到 NSArrayController。 一个 NSArray... 来存储文本?另外,您知道实体不能具有有序集合属性,对吗?您必须创建并执行提取请求,如果您希望对象以非随机顺序排列,则需要为提取请求提供排序描述符。 嗯,这不仅仅是文字,但这不相关。我的 Nib 文件中确实有一个 NSArrayController 来控制 Array。 【参考方案1】:

我已经制作了一个测试应用程序,其中 IBOutlet 从 Xib 连接到 NSArrayController。在这个测试中,我有:

从 Core Data 应用程序模板开始; 在数据模型中创建了具有两个属性(字符串、整数)的实体;

在 Xib 中:

带有托管对象上下文的数组控制器,连接到 Test_AppDelegate.managedObjectContext; TableView 与 cols 连接到 Array Controller 的第一个和第二个属性排列对象; 添加和删除按钮,连接到阵列控制器的添加:和删除:操作; 按钮“显示计数”和标签; -

在代码中 (Test_AppDelegate.*):

IBOutlet NSArrayController *ac; (在 Xib 中从 Test_AppDelegate.ac 连接到阵列控制器); IBOutlet NSTextField *nLabel; (在 Xib 中连接到标签); (IBAction)showNum:(id)sender; (从“显示计数”按钮连接); 代码在行动 showNum: [nLabel setIntValue:[[ac mappedObjects] count]];

我能够:

向表格视图和受控数组添加/删除对象; 从代码中访问 NSArrayController 以获取 ArrangeObjects 数组。

因此,将 IBOutlet 从代码绑定到 Xib 的数组控制器并访问它的排列对象应该可以工作。

【讨论】:

我尝试使用 IBOutlet 来声明 objectArray 并将其链接到 NSArrayController。但是我在“ if( [objectArray indexOfObject:rootObj] % 2 ) ”行上收到一条错误消息,说“二进制%的操作数无效”,因为它正在寻找一个数组而不是数组控制器。我将如何解决这个问题?我还用我正在使用的所有代码更新了第一篇文章。 我还从我得到代码的地方读到我需要创建一个选择器。这就是他们所说的,假设 self 响应一个选择器 -objectArray,它返回一个显示在大纲视图中的***对象数组,并且顺序正确。 应该清楚地认识到 NSArrayController 是对象数组的控制器,而不是数组本身。因此,要从此控制器访问对象,您应该使用排列对象属性,该属性“返回一个数组,其中包含使用排列对象排列的接收者的内容对象:”(来自 Apple 文档)。这些对象按照数组控制器的排序器和过滤器排列,并表示为一组生成的托管对象(NSManagedObject)。每个对象都包含数据模型中描述的值,这些值可以通过 valueForKey: 方法的键访问。 因此,在您的情况下, [objectArray mappedObjects] 将返回您所有对象的 NSArray。这些对象将具有 NSManagedObject 类型(或从它继承)并且属性可以通过 [obj valueForKey:@"attributeNameFromDataModel"] 访问。我不确定您的代码中的 anItem 是否返回正确类型的对象 (NSManagedObject) 并且它可以用作 indexOfObject: 参数,但至少您可以从我描述的方法中获取一整套对象并进行自己的搜索。 那么我需要在第一篇文章的代码中更改或添加什么代码?【参考方案2】:

我可能没有得到这个 - 但你不能只创建一个 initWithArray 方法吗?

【讨论】:

你能举个例子吗? 您在哪里创建 MyOulineView - 您是在代码中创建的吗?如果是这样,那么不要使用 init 覆盖 init 并将您的 NSArray 添加到类中。 不,我在界面生成器中创建了 MyOutlineView。您能否提供一些示例代码以及我需要在代码中添加的内容?

以上是关于如何将 NSArray 和 NSArrayController 与 Core Data 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NSMutableArray 转换为 NSArray?

如何将 sqlite3 表分配给 nsarray

如何将 NSArray 元素加入 NSString?

读取和存储多个 NSArray

如何将整个索引路径、上一个、上一个和当前选定的索引路径值存储到 didSelectRowAtIndexPath 中的 NSArray:方法

如何将 NSdictionaries 的 NSarray 转换为 XML 文件?