我有一个带有两个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中的所有绑定都是正确的。
答案 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中重新连接它们,一切都只是自动再次工作。