Как программно заполнить NSArrayController строками CoreData? - PullRequest
1 голос
/ 15 февраля 2011

После нескольких часов / дней поиска и изучения примеров проектов я пришел к выводу, что мне нужно просто спросить. Если я связываю assetsView (IKImageBrowserView) напрямую с экземпляром IB NSArrayController, все работает нормально.

- (void) awakeFromNib
{
    library = [[NSArrayController alloc] init];
    [library setManagedObjectContext:[[NSApp delegate] managedObjectContext]];
    [library setEntityName:@"Asset"];       

    NSLog(@"%@", [library arrangedObjects]);
    NSLog(@"%@", [library content]);

    [assetsView setDataSource:library];
    [assetsView reloadData];
}

Оба NSLogs пусты. Я знаю, что что-то упустил ... Я просто не знаю что. Цель состоит в том, чтобы в конечном итоге позволить нескольким экземплярам «библиотеки» этого представления программно фильтроваться с помощью предиката. Сейчас я просто пытаюсь, чтобы он отображал все строки для объекта «Актив».

Добавление: если я создаю NSArrayController в IB, а затем пытаюсь зарегистрировать [library arrangedObjects] или вручную установить источник данных для assetsView, я получаю те же пустые результаты. Как я уже говорил ранее, если я связываю library.arrangedObjects с assetsView.content (IKImageBrowserView) в IB - с тем же контекстом управляемого объекта и тем же именем сущности, установленным IB - все работает как ожидалось.

- (void) awakeFromNib
{
//  library = [[NSArrayController alloc] init];
//  [library setManagedObjectContext:[[NSApp delegate] managedObjectContext]];
//  [library setEntityName:@"Asset"];       

    NSLog(@"%@", [library arrangedObjects]);
    NSLog(@"%@", [library content]);

    [assetsView setDataSource:library];
    [assetsView reloadData];
}

Ответы [ 3 ]

9 голосов
/ 15 ноября 2012

Я столкнулся с подобной ситуацией, когда (IKImageBrowserView) не инициализировался, хотя ArrayController в конечном итоге синхронизировался с NSManagedObjectContext.

В конечном итоге этот отрывок был найден в руководстве по программированию основных данных

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdBindings.html#//apple_ref/doc/uid/TP40004194-SW3

, если флаг «автоматически подготавливает содержимое» (см., Например, setAutomaticsPreparesContent:) устанавливается для контроллера, начальное содержимое контроллера извлекается из контекста его управляемого объекта с использованием текущего предиката выборки контроллера.Важно отметить, что выборка контроллера выполняется как отложенная операция, выполняемая после установки контекста управляемого объекта (путем загрузки пера) - поэтому это происходит после awakeFromNib и windowControllerDidLoadNib :.Это может создать проблему, если вы хотите выполнить операцию с содержимым контроллера объекта любым из этих методов, так как содержимое контроллера равно нулю.Вы можете обойти это, выполнив выборку «вручную» с помощью fetchWithRequest: merge: error :.

- (void)windowControllerDidLoadNib:(NSWindowController *) windowController
{
[super windowControllerDidLoadNib:windowController];

NSError *error = nil;
BOOL ok = [arrayController fetchWithRequest:nil merge:NO error:&error];
// ...
0 голосов
/ 01 августа 2014

Может также быть добавлено в awakeFromNib, если наследовать NSArrayCotroller или через ваш контроллер представления

-(void)awakeFromNib
{
    [self fetchWithRequest:nil merge:NO error:nil];

    ...
}
0 голосов
/ 20 февраля 2011

Похоже, проблема в том, что вы на самом деле не сказали NSArrayController что-либо извлечь. NSArrayControllers пусты до тех пор, пока вы не добавите объекты с помощью привязок или вручную.

После настройки библиотеки попробуйте вызвать ее метод извлечения:

[library fetch:self];

Кроме того, вы, вероятно, уже знаете это, но в коде можно установить привязки следующим способом:

- (void)bind:(NSString *)binding toObject:(id)observableController withKeyPath:(NSString *)keyPath options:(NSDictionary *)options
...