Мне очень удобно писать приложения для iOS, но OS X неожиданно кажется чем-то чужеродным.
Вот вопрос заранее (читайте дальше для контекста):
Когда мое приложение запускается с использованием набора .xib в поле «Основной интерфейс» в информации о развертывании цели моего приложения, почему экземпляр AppDelegate создается после ViewControllers?
Контекст (не каламбур):
Причина, по которой я спрашиваю, заключается в том, что я использую Core Data (избавьте меня от каких-либо возражений по поводу этого решения), и обычно вы сохраняете указатель на MOC (контекст управляемого объекта) в AppDelegate. Один из моих контроллеров пытается получить эту переменную экземпляра MOC, но экземпляра AppDelegate еще нет, и поэтому мое приложение не представляет данные сразу после запуска.
AppDelegate и два ViewController находятся в .xib. VC подключены к представлениям внутри разделенного представления. Они пытаются использовать MOC в viewDidLoad для выполнения запросов. Они обращаются к AppDelegate следующим образом:
let delegate = NSApplication.sharedApplication().delegate as AppDelegate
let moc = delegate.managedObjectContext
Это приведет к сбою, так как свойство .delegate
элемента sharedApplication()
возвращает nil.
Я попытался создать NSWindowController из .xib в applicationDidFinishLaunching
и удалить .xib из поля основного интерфейса, но тогда applicationDidFinishLaunching
вообще не вызывается.
Я убедился, что все подключения в IB для делегирования IBOutlets приложения и владельца файлов (NSApplcation) к AppDelegate выполнены.
ОБНОВЛЕНИЕ — 31 марта 2015 г.
Ответ Стивена Дарлингтона ниже предлагает хорошее решение для моего/этого случая. И насколько я понимаю, на самом деле лучше настроить MOC так, как он предложил.
Если будет получен правильный ответ, объясняющий, почему экземпляр AppDelegate создается позднее в процессе запуска, я отмечу его правильным, а не ответ Стивена. Спасибо Стивен!
IBOutlet
дляAppDelegate
и/или в каком методе контроллера представления вы пытаетесь для доступа кAppDelegate
(например,init
,awakeFromNib
и т. д.)? - person NSGod   schedule 21.03.2015@NSApplicationMain
в классе AppDelegate, чтобы попытаться заставить его раньше запускать экземпляр делегата? - person stevesliva   schedule 23.03.2015