Umumnya, sistem harus menangani pembuatan instance pengontrol tampilan dengan storyboard. Yang Anda inginkan adalah melintasi hierarki viewController dengan mengambil referensi ke alih-alih self.window.rootViewController
menginisialisasi pengontrol tampilan, yang seharusnya sudah diinisialisasi dengan benar jika Anda telah menyiapkan storyboard dengan benar.
Jadi, katakanlah Anda rootViewController
adalah UINavigationController dan kemudian Anda ingin mengirim sesuatu ke pengontrol tampilan teratasnya, Anda akan melakukannya seperti ini di AppDelegate Anda didFinishLaunchingWithOptions
:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
Di Swift, jika akan sangat mirip:
let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data
Anda sebaiknya tidak menginisialisasi pengontrol tampilan menggunakan id storyboard dari delegasi aplikasi kecuali jika Anda ingin melewati cara normal storyboard dimuat dan memuat sendiri seluruh storyboard. Jika Anda harus menginisialisasi adegan dari AppDelegate, kemungkinan besar Anda melakukan kesalahan. Maksud saya membayangkan Anda, karena alasan tertentu, ingin mengirim data ke pengontrol tampilan di bawah tumpukan, AppDelegate tidak boleh menjangkau cara ke tumpukan pengontrol tampilan untuk mengatur data. Itu bukan urusannya. Bisnisnya adalah rootViewController. Biarkan rootViewController menangani anaknya sendiri! Jadi, jika saya melewati proses pemuatan storyboard normal oleh sistem dengan menghapus referensi ke dalamnya di file info.plist, saya paling banyak akan membuat contoh rootViewController menggunakaninstantiateViewControllerWithIdentifier:
, dan mungkin akarnya jika itu adalah sebuah container, seperti UINavigationController. Yang ingin Anda hindari adalah membuat instance pengontrol tampilan yang telah dibuat oleh storyboard. Ini adalah masalah yang sering saya lihat. Singkatnya, saya tidak setuju dengan jawaban yang diterima. Ini tidak benar kecuali poster bermaksud untuk menghapus pemuatan storyboard dari info.plist karena Anda akan memuat 2 storyboard jika tidak, yang mana tidak masuk akal. Ini mungkin bukan kebocoran memori karena sistem menginisialisasi adegan root dan menetapkannya ke jendela, tetapi kemudian Anda datang dan membuat instance lagi dan menetapkannya lagi. Aplikasi Anda dimulai dengan awal yang sangat buruk!