2013-05-14 2 views
0

Я добавляю экземпляр в основные данные. Предприятие представлено NSArrayController. Я хотел бы получить доступ к вновь добавленному экземпляру через контроллер. добавляетсяОсновные данные: Как обновить NSArrayController сразу после добавления NSManagedObject?

«Skill» экземпляр

А и затем я пытаюсь получить к нему доступ через selectAddedObject следующим образом:

-(void)addSkill 
{ 
    [self selectAddedObject:[NSEntityDescription insertNewObjectForEntityForName:@"Skill" 
                  inManagedObjectContext:self.managedObjectContext]]; 
} 

- (void)selectAddedObject:(NSManagedObject *)addedMO 
{ 
    [self.sectionArrayController setSelectedObjects:[NSArray arrayWithObject:addedMO]]; 
    NSLog(@"Selected: %@", [self.sectionArrayController valueForKey:@"selectedObjects"]); 
} 

Это только кажется, работает, если добавить

[self.managedObjectContext processPendingChanges]; 

в качестве первой линии selectAddedObject:. Но как только я это сделаю, документ, похоже, забыл, что ему все еще нужно сохранять, и я мог бы отказаться от приложения, не добавляя при этом автоматическое сохранение. Не хотите навязывать это пользователям!

Любые идеи о способе немедленного обновления контроллера массива каким-либо другим способом? Или, возможно, добавить объект по-другому? Несколько ранних ответов (например, Updating NSTableView when enitiy is added to core data) кажутся немного устаревшими из-за изменений в OSX.

Спасибо!

ответ

1

Используйте контроллер массива для добавления объекта. В какой-то момент во время конфигурации, убедитесь, что объект установлен ([self.sectionArrayController setEntityName:@"Skill"]), а затем сделать все ваши работы, чтобы создать и выбрать:

- (void)createAndSelectNewObject 
{ 
    Skill *addedMO = [self.sectionArrayController newObject]; 

    if([self.sectionArrayController commitEditing]) { 

     [self.sectionArrayController setSelectedObjects:[NSArray arrayWithObject:addedMO]]; 
     NSLog(@"Selected: %@", [self.sectionArrayController valueForKey:@"selectedObjects"]); 
    } 
} 

Вы должны совершать какие-либо изменения, прежде чем изменить выбор тоже (и только изменить выбор, если редактирование было совершено или не было).

+0

Спасибо, это выглядит очень элегантно. У меня есть проблема после попытки этого решения: 'self.sectionArrayController' по-прежнему имеет неизмененное количество объектов после фиксации! Но возвращаемое значение - 'YES'. Hmmm .... – markjs

+0

Просто используя 'add:' на контроллере массива (в IB) также не выбирает новый объект, даже если в построителе интерфейсов не отмечено «Выбрать вставленные объекты». – markjs

+0

Что работает, добавляет '[self.managedObjectContext processPendingChanges];'. Мне бы очень хотелось обойтись. Есть ли причина, по которой '-commitEditing' не работает, и' -processPendingChanges' делает? – markjs

Смежные вопросы