Как правило, система должна обрабатывать создание экземпляра контроллера представления с помощью раскадровки. Что вы хотите, так это пройти иерархию viewController, захватив ссылку на, self.window.rootViewController
а не на инициализацию контроллеров представления, которые уже должны быть правильно инициализированы, если вы правильно настроили раскадровку.
Итак, предположим, что вы rootViewController
UINavigationController, а затем вы хотите отправить что-то в его контроллер верхнего вида, вы бы сделали это в своем AppDelegate следующим образом didFinishLaunchingWithOptions
:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
В Swift if будет очень похоже:
let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data
Вам действительно не следует инициализировать контроллеры представления с использованием идентификаторов раскадровки от делегата приложения, если вы не хотите обойти обычный способ загрузки раскадровки и загрузить всю раскадровку самостоятельно. Если вам нужно инициализировать сцены из AppDelegate, вы, скорее всего, делаете что-то не так. Я имею в виду, что вы по какой-то причине хотите отправить данные в контроллер представления вниз по стеку, AppDelegate не должен попадать в стек контроллера представления для установки данных. Это не его дело. Это дело rootViewController. Позвольте rootViewController обрабатывать своих собственных потомков! Итак, если бы я обходил обычный процесс загрузки раскадровки системой, удаляя ссылки на нее в файле info.plist, я бы в лучшем случае создал экземпляр rootViewController, используяinstantiateViewControllerWithIdentifier:
, и, возможно, его корень, если это контейнер, например UINavigationController. Чего вы хотите избежать, так это создания экземпляров контроллеров представления, которые уже были созданы раскадровкой. Я часто вижу эту проблему. Короче не согласен с принятым ответом. Это неверно, если плакаты не предназначены для удаления загрузки раскадровки из info.plist, поскольку в противном случае вы загрузите 2 раскадровки, что не имеет смысла. Вероятно, это не утечка памяти, потому что система инициализировала корневую сцену и назначила ее окну, но затем вы пришли, создали ее снова и назначили снова. Ваше приложение запущено очень плохо!