NSArrayController addObject返回null

时间:2010-01-06 03:36:13

标签: cocoa core-data nsarraycontroller

我有一个带有两个NIB的核心数据应用程序,主窗口带有一对NSTableViews和一个用于添加内容的表单。该表单有一个NSTextView和一个NSTextField。我在核心数据中有两个实体,并使用两个NSArrayControllers管理内容。使用一个NSArrayController,我的AppDelegate中的以下代码可以正常添加内容:

    id o = [bookController newObject];
    [o setValue:@"Drafts" forKey:@"bookName"];
    [o setValue:0 forKey:@"sortOrder"];
    [bookController addObject:o];

但是,我的AppController类中的代码总是返回null:

NSObject *o = [chapterArrayController newObject];

[o setValue:contentOfchapter forKey:@"chapterText"];
[o setValue:chapterTitleString forKey:@"chapterTitle"];
[o setValue:@"Drafts" forKey:@"bookChapter"];
NSLog(@"Where is the object?: %@", o);
[chapterArrayController addObject:o];

似乎chapterArrayController没有连接到核心数据中的Chapter实体,但IB中的绑定是正确的。我认为这与多个笔尖有关,但我在这里有点不知所措。

赞赏任何正确方向的指针。

感谢。

更新2:我创建了一个名为JBAddChapter的类,如下所示:

JBAddChapter.h

#import <Cocoa/Cocoa.h>


@interface JBAddChapter : NSObject {

IBOutlet NSArrayController *bookController;
IBOutlet NSArrayController *chapterArrayController;

}
- (IBAction)testArrayControllers:(id)sender;
+ (void)getChapterData:(NSString *)passedChapterTitle withChapterText:(NSString *)passedChapterText;
- (void)standAloneTestArrayControllers;

@end

JBAddChapter.m

#import "JBAddChapter.h"


@implementation JBAddChapter


+ (void)getChapterData:(NSString *)passedChapterTitle withChapterText:(NSString *)passedChapterText;
{
    [[self alloc] standAloneTestArrayControllers];
}


- (IBAction)testArrayControllers:(id)sender
{
    [self standAloneTestArrayControllers];
}

- (void)standAloneTestArrayControllers
{
    [chapterArrayController fetchWithRequest:nil merge:NO error:nil];
    NSLog(@"1. chapterArrayController %@", chapterArrayController);

    NSArray *a = [chapterArrayController arrangedObjects];
    NSLog(@"2. NSArray a = %@", a);

    NSUInteger numberOfMenuItems = [a count];
    NSLog(@"3. Count of items in array: %d", numberOfMenuItems);

    [bookController fetchWithRequest:nil merge:NO error:nil];
    NSLog(@"1. bookController %@", chapterArrayController);

    NSArray *b = [chapterArrayController arrangedObjects];
    NSLog(@"2. NSArray b = %@", b);

    NSUInteger newNumberOfMenuItems = [a count];
    NSLog(@"3. Count of items in array: %d", newNumberOfMenuItems);
}
@end

我在主窗口的IB中创建了两个按钮,并将其连接到上面的testArrayControllers IBAction。另一个按钮我连接到AppController和这个IBAction:

- (IBAction)testArrayControllers:(id)sender
{
    [JBAddChapter getChapterData:nil withChapterText:nil];
}

如果我从JBAddChapter的IBAction调用standAloneTestArrayControllers,一切正常。如果我使用JBAddChapter中的工厂方法从AppController调用相同的方法,我的数组控制器是零。

2010-01-07 06:15:36.971 Scout[3881:a0f] 1. chapterArrayController <NSArrayController: 0x200060b40>[entity: Chapter, number of selected objects: 1]
2010-01-07 06:15:36.972 Scout[3881:a0f] 2. NSArray a = (
loads of stuff
)
2010-01-07 06:15:36.973 Scout[3881:a0f] 3. Count of items in array: 9
2010-01-07 06:15:36.974 Scout[3881:a0f] 1. bookController <NSArrayController: 0x200060b40>[entity: Chapter, number of selected objects: 1]
2010-01-07 06:15:36.978 Scout[3881:a0f] 2. NSArray b = (
loads of stuff
)
2010-01-07 06:15:36.979 Scout[3881:a0f] 3. Count of items in array: 8
2010-01-07 06:15:38.402 Scout[3881:a0f] 1. chapterArrayController (null)
2010-01-07 06:15:38.402 Scout[3881:a0f] 2. NSArray a = (null)
2010-01-07 06:15:38.402 Scout[3881:a0f] 3. Count of items in array: 0
2010-01-07 06:15:38.403 Scout[3881:a0f] 1. bookController (null)
2010-01-07 06:15:38.403 Scout[3881:a0f] 2. NSArray b = (null)
2010-01-07 06:15:38.403 Scout[3881:a0f] 3. Count of items in array: 0

那么,为什么数组控制器会从一个方法返回nil而不是另一个方法呢?据我所知,IB中的所有绑定都是正确的。

3 个答案:

答案 0 :(得分:0)

当你询问对象时,chapterArrayController是否为零?

你说你有两个笔尖......是在第二个笔尖实例化的chapterArrayController吗?如果是这样,是否在调用newObject时加载了nib?

答案 1 :(得分:0)

[[self alloc] standAloneTestArrayControllers];

永远不要这样做。始终通过向实例发送init(或initWithSomethingElse:,具体取决于类提供的初始化程序)消息来初始化实例。如果您将任何其他消息发送到新分配但尚未初始化的实例,则结果是未定义的,几乎肯定是错误的。

[bookController fetchWithRequest:nil merge:NO error:nil];
NSLog(@"1. bookController %@", chapterArrayController);

您确定不打算在此处bookController,而不是chapterArrayController吗?

  

如果我从JBAddChapter的IBAction调用standAloneTestArrayControllers,一切正常。如果我使用JBAddChapter中的工厂方法从AppController调用相同的方法,我的数组控制器是零。

因为你尚未加载笔尖。既没有从nib加载章节对象,也没有加载nib本身的章节对象,也没有任何明确的(如在setChapterArrayController:中),因为章节对象是一个数组控制器来保持。

它适用于action方法,因为在该上下文中,加载了nib。

  

那么,为什么数组控制器会从一个方法返回nil,而不是另一个方法返回?

数组控制器没有返回nil;他们不存在。 (此外,函数和方法返回值,而不是对象或类。)您为保存数组控制器而创建的变量保持nil,因为您没有在那里放置任何数组控制器。

假设JBAddChapter意图拥有add-chapter表,它应该在其init方法中加载nib(或实例化一个窗口控制器),你应该从主窗口的所有者创建对象(并让该对象拥有add-chapter对象,并且只使用它拥有的add-chapter对象,或者使add-chapter对象成为单例。前者更容易。

当然,当您创建此对象或任何其他对象时,您必须始终使用alloc + init / initWith…对(或提供)自动释放便利方法);否则,就像现在一样,您的对象将不会加载其笔尖,因为您从未向其发送init消息。

答案 2 :(得分:0)

猜猜我会在这里回答我自己的问题。我的NIB出了问题,一旦我删除了我的阵列控制器,并在IB中重新连接它们,一切都只是自动再次工作。