У меня есть NSTableView, значение NSTableColumn которого привязано к NSArrayController. Контроллер arrayController управляет набором объектов в моем основном контексте объектов, управляемых данными.NSArrayController, создавая объекты CoreData программно, и KVO
Он работает хорошо, и когда новые объекты вставляются в массив Controller через действия пользовательского интерфейса, tableView выбирает новый элемент.
Однако я хотел бы создать новые объекты в moc программно, а затем выбрать новый объект в arrayController.
Я попытался следующие:
Image *newImage = [Image newImage]; // convenience method to insert new entity into mod.
newImage.title = [[pathToImage lastPathComponent] stringByDeletingPathExtension];
newImage.filename = [pathToImage lastPathComponent];
[self.primaryWindowController showImage:newImage];
ShowImage: метод, как так:
- (void)showImage:(Image *)image
{
[self.imagesArrayController fetch:self];
[self.imagesArrayController setSelectedObjects:@[image]];
}
Однако arrayController не меняет свой выбор.
Я делаю это неправильно? Я предполагаю, что объект newImage, который я создал в moc, совпадает с объектом, которым управляет arrayController. Если это правда, почему переменная arrayController не меняет свой выбор?
Хмм - проверяя это предположение, я теперь проверил содержимое arrayController во время выполнения. Новое изображение нет - что я предполагаю, что означает, что я «пошел за спиной» привязок вручную путем вставки в МОС ...
Моего newImage удобного метода является, как так:
+ (Image *)newImage
{
Image *newImage = [NSEntityDescription insertNewObjectForEntityForName:@"Image" inManagedObjectContext:[[CoreDataController sharedController] managedObjectContext]];
return newImage;
}
Разве это не соответствует требованиям KVO?
хммм - Edit 2 ...
Я предполагаю, что это KVO соответствует, так как новое изображение отображается в пользовательском интерфейсе. Теперь я думаю, что существует задержка между вставкой объекта в moc и сообщением arrayController.
I See from this question New Core Data object doesn't show up in NSArrayController arrangedObjects (с полезной ссылкой справа от этого вопроса SO), в котором запрашивается массивController: должен помочь обновить arrayController, но фактическая выборка не произойдет до следующего раза runloop работает.
Должен ли я откладывать выбор нового объекта с помощью таймера? Это кажется немного безвкусным ...
У вас есть класс 'coreDataController sharedController '' class. Почти как если бы это было похоже на одноэлементный класс, если вы не возражаете, не могли бы вы поделиться этим классом CoreDataController, который у вас есть в репозитории git? Это было бы очень полезно для таких людей, как я и многие другие, которые попадают в Core Data. Увидеть практический пример было бы очень полезно. Спасибо Diggory – Pavan
На самом деле нет необходимости в таком «coreDataController», поскольку API CoreData достаточно ясен, и вы используете их из многих мест в своем приложении, нет смысла централизовать вызовы CoreData на один конкретный контроллер. Кроме того, в приведенном выше примере лучшей реализацией было бы взятие управляемых объектов из самого нового объекта, а не из какого-то несопоставимого контроллера, чей контекст может отличаться. (например, в приложениях на основе документов контроллер окна документа имеет mangedObjectContext) –