Какао не может выполнить операцию без контекста управляемого объекта - PullRequest
1 голос
/ 09 августа 2011

У меня есть приложение на основе окна Mac, использующее привязки CoreData и Cocoa для привязки сущности CoreData к NSArrayController для отображения в NSCollectionView.

У меня есть свойство на моем контроллере (которое установлено как Владелец Файлов представлений), называемое managedObjectConext. В методе awakeFromNib я попытался установить для свойства managedObjectContext (MOC) значение:

managedObjectContext = [(MyApplicationAppDelegate *)[[NSApplication sharedApplication] delegate] managedObjectContext];
managedObjectContext = [[NSApp delegate] managedObjectContext];

Я также настроил привязки MOC NSArrayControllers к свойству MOC «Владелец файла» и привязки атрибутов к моей сущности CoreData.

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

Какао Невозможно выполнить операцию без контекста управляемого объекта

Я вошел в консоль, чтобы проверить, что MOC не равен nil, что, как я полагаю, не совпадает с NSLog из объекта MOC: myMoc = NSManagedObjectContext: 0x10052f9c0

Теперь я совершенно ошеломлен и расстроен, что то, что должно быть таким простым, заняло так много моего времени! Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

5 голосов
/ 10 августа 2011

Привязки определены в кончике, поэтому, если кончик не знает о свойстве managedObjectContext контроллера, то и привязки тоже не знают.

В редакторе интерфейса вам необходимо привязать ключ managedObjectContext на панели привязок контроллера массива к конкретному контексту.

Самый простой способ сделать это для приложения с одним контекстом - это пометить свойство managedObjectContext в делегате приложения как IBOutlet, чтобы оно отображалось в редакторе интерфейса.Затем просто свяжите его прямо с панели контроллера массива.

Честно говоря, я не знаю, почему они не делают этого в самом шаблоне Xcode.Вы делаете это так часто.

3 голосов
/ 22 апреля 2013

У меня была такая же проблема.Это исправило это:

Переместите строки:

managedObjectContext = [(MyApplicationAppDelegate *)[[NSApplication sharedApplication] delegate] managedObjectContext];
managedObjectContext = [[NSApp delegate] managedObjectContext];

из метода awakeFromNib в метод init.

1 голос
/ 21 октября 2015

В swift добавьте это к любому контроллеру представления, к которому подключен ArrayController:

    var managedObjectContext:NSManagedObjectContext? = {
            let delegater = NSApplication.sharedApplication().delegate as! AppDelegate
    return delegater.managedObjectContext
}()
...