Як правило, система повинна обробляти екземпляр контролера подання за допомогою раскадровки. Те, що ви хочете, - це перейти ієрархію viewController, схопивши посилання на self.window.rootViewController
протилежне до ініціалізації контролерів перегляду, яке вже має бути ініціалізовано правильно, якщо ви правильно встановили дошку розкадрувань.
Отже, скажімо, що ваш rootViewController
UINavigationController, і тоді ви хочете щось надіслати його контролеру виду зверху, ви зробите це так у вашому AppDelegate didFinishLaunchingWithOptions
:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
У Swift було б дуже схоже:
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 дошки, що не має сенсу. Мабуть, це не витік пам'яті, оскільки система ініціалізувала кореневу сцену та призначила її у вікно, але потім ви прийшли та інстанціонували її знову та призначили її знову. Ваш додаток вимкнено досить погано!