Как правило, система должна обрабатывать создание экземпляра контроллера представления с помощью раскадровки. Что вы хотите, так это пройти иерархию viewController, захватив ссылку на, self.window.rootViewControllerа не на инициализацию контроллеров представления, которые уже должны быть правильно инициализированы, если вы правильно настроили раскадровку.
Итак, предположим, что вы rootViewControllerUINavigationController, а затем вы хотите отправить что-то в его контроллер верхнего вида, вы бы сделали это в своем 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 раскадровки, что не имеет смысла. Вероятно, это не утечка памяти, потому что система инициализировала корневую сцену и назначила ее окну, но затем вы пришли, создали ее снова и назначили снова. Ваше приложение запущено очень плохо!