pertimbangkan skenario berikut: Saya memiliki aplikasi berbasis storyboard. Saya menambahkan objek ViewController ke storyboard, menambahkan file kelas untuk ViewController ini ke dalam proyek dan menentukan nama kelas baru di inspektur identitas IB. Sekarang bagaimana saya akan merujuk ke ViewController ini secara terprogram dari AppDelegate? Saya telah membuat variabel dengan kelas yang relevan dan mengubahnya menjadi properti IBOutlet, tetapi saya tidak melihat cara apa pun untuk dapat merujuk ke ViewController baru dalam kode - setiap upaya untuk ctrl-seret koneksi tidak berfungsi .
yaitu dalam AppDelegate saya bisa mendapatkan ViewController dasar seperti ini
(MyViewController*) self.window.rootViewController
tapi bagaimana dengan ViewController lain yang ada di dalam storyboard?
iphone
objective-c
ios
uiviewcontroller
storyboard
Matthias D
sumber
sumber
Jawaban:
Lihat dokumentasi untuk
-[UIStoryboard instantiateViewControllerWithIdentifier:]
. Ini memungkinkan Anda untuk membuat contoh pengontrol tampilan dari storyboard Anda menggunakan pengenal yang Anda setel di IB Attributes Inspector:DIEDIT untuk menambahkan kode contoh:
sumber
[[[self window] rootViewController] storyboard]
Menurut dokumen, ini akan mengembalikan "storyboard tempat pengontrol tampilan berasal." (atau nol jika tidak berasal dari storyboard). Dari UIStoryboard * itu, Anda dapat menggunakan panggilan instantiate yang disebutkan @RobinSummerhill. Perhatikan bahwa Storyboards membuat instance baru dari viewControllers ( adegan ) Anda saat diperlukan dan tidak menggunakan kembali yang sebelumnya dilihat.Jika Anda menggunakan
XCode
5 Anda harus melakukannya dengan cara yang berbeda.UIViewController
diUIStoryboard
Identity Inspector
di panel kanan atasUse Storyboard ID
kotaknyaStoryboard ID
bidang tersebutKemudian tulis kode Anda.
sumber
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 AndadidFinishLaunchingWithOptions
:Di Swift, jika akan sangat mirip:
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 menggunakan
instantiateViewControllerWithIdentifier:
, 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!sumber
sumber