У меня есть приложение с основными данными с двумя NIB, основным окном с парой NSTableViews и формой для добавления контента. Форма имеет NSTextView и NSTextField. У меня есть два объекта в основных данных и управляйте контентом двумя NSArrayControllers. С одной NSArrayController, следующий код в моем AppDelegate прекрасно работает для добавления контента:NSArrayController addObject Возвращает нуль
id o = [bookController newObject];
[o setValue:@"Drafts" forKey:@"bookName"];
[o setValue:0 forKey:@"sortOrder"];
[bookController addObject:o];
Но этот код в моем классе AppController всегда возвращает нуль:
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 правильны. Я думаю, что это имеет какое-то отношение к множеству ножей, но я здесь как-то в порядке.
Любые указатели в правильном направлении оцениваются.
Спасибо.
Update 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 в моем главном окне, и подключил один к testArayControllers IBAction выше. Другая кнопка я подключить к AppController и это IBAction:
- (IBAction)testArrayControllers:(id)sender
{
[JBAddChapter getChapterData:nil withChapterText:nil];
}
Если я называю standAloneTestArrayControllers
из IBAction JBAddChapter в, все работает отлично. Если я вызову тот же метод из AppController, используя фабричный метод в JBAddChapter, я контроллеры массива равны нулю.
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
Итак, почему контроллеры массива должны возвращать нуль от одного метода, но не к другому? Насколько мне известно, все привязки в IB правильны.
Вы должны использовать 'NSUInteger' для возвращаемого значения' count'. 'int' слишком короток на 64-битных машинах, а неправильная подпись (значения могут быть отрицательными, что не имеет смысла для подсчета вещей). –
Спасибо, Питер, я сделал вашу предложенную настройку. –