0

Прошло некоторое время с тех пор, как я занялся CoreData и macOS, во времена xib и nib. С xib существует «владелец файла», который может предоставить вам доступ к вашему документу и управляемому объекту. Легко.NSPsistentDocument, Swift, macOS и раскадровки - как получить managedObjectContext?

С NSPersistentDocument и моей раскадровкой у меня проблема с курицей и яйцом. В моем классе документа, наследнике NSPersistentDocument, у меня есть следующее:

override func makeWindowControllers() { 
    // Returns the Storyboard that contains your Document window. 
    let storyboard = NSStoryboard(name: "Main", bundle: nil) 
    let windowController = storyboard.instantiateControllerWithIdentifier("Document Window Controller") as! NSWindowController // <- when I need the moc 
    self.addWindowController(windowController) 
    windowController.contentViewController!.representedObject = self // <- when I set the representedObject 
} 

Это, кажется, что многие люди, в том числе Apple, предлагают.

Моя проблема заключается в следующем: в MainViewController я хочу иметь Object Controller, и он должен быть привязан к управляемому объектуObjectContext, но когда ему нужно иметь managedObjectContext, я еще не установил selfObject для себя. Таким образом, исключение выбрасывается. Установка объекта createdObject в конце метода makeWindowControllers слишком поздно, но я все равно не вижу его раньше.

ответ

0

Хорошо. Так. Я не знаю, что происходило прошлой ночью, но я не мог заставить это работать.

Этим утром я перечитал документацию по representedObject:

Свойства representedObject является ключ-значение кодирования и ключ-значение соблюдения требований. Когда вы используете представленный объект в качестве владельца файла файла nib, вы можете связать элементы управления с владельцем файла, используя ключевые пути, которые начинаются со строки представленной Object.

Документы ясно говорят мне, что магия в представленном объекте. Поэтому я убедился, что мой метод makeWindowControllers был таким же, как и выше, и я убедился, что мой Object Controller в моей раскадровке был таким, как документы сказали, что это должно быть.

Don’t mind the (!)

Я не был удивлен, что путь имеет немного (!), Потому что representedObject это просто AnyObject.

Я тогда послушно запустил приложение, полностью ожидая, что он не сработает.

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

Последующие действия: В качестве эксперимента я попробовал один из поворотов со вчерашнего дня. (!) Для того, чтобы избавиться от и иметь ссылку под рукой на MOC, я добавил этот метод к MainViewController:

var moc:NSManagedObjectContext? { 
    if let doc = self.representedObject as? Document { 
     return doc.managedObjectContext 
    } 
    return nil 
} 

И тогда я использовал «self.moc» в качестве ключа Path модели для моего объекта контроллер. Это не сработало, и появилось знакомое исключение. Восстановите путь ключа модели к «self.representedObject.managedObjectContext», и все работает хорошо. ... как магия.

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

  • Нет связанных вопросов^_^