Isu
Aku mulai mengambil melihat yang baru Swift
di Xcode 6
, dan aku mencoba beberapa proyek demo dan tutorial. Sekarang saya terjebak di:
Instantiating dan kemudian menyajikan viewController
dari storyboard tertentu
Solusi Objektif-C
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"myVCID"];
[self presentViewController:vc animated:YES completion:nil];
Bagaimana cara mencapai ini di Swift?
ios
objective-c
swift
uiviewcontroller
E-Riddie
sumber
sumber
;
! ;) Apakah Anda keberatan menguraikanas UIViewController
? Mengapa itu perlu?as
kata kunci digunakan untuk typecasting. Sama seperti(UIViewController *)anObject
pada tujuan cinstantiateViewControllerWithIdentifier
kembaliAnyObject
(id
setara dengan Swift) dan saya menyatakanvc
sebagaiUIViewController
, saya harus mengetikkanAnyObject
keUIViewController
.Untuk orang yang menggunakan jawaban @ akashivskyy untuk instantiate
UIViewController
dan memiliki pengecualian:Kiat cepat:
Implementasikan secara manual
required init?(coder aDecoder: NSCoder)
di tujuanUIViewController
Anda yang ingin Anda instantiateJika Anda membutuhkan deskripsi lebih lanjut, silakan merujuk ke jawaban saya di sini
sumber
init(coder aDecoder: NSCoder!)
"wajib". Jadi sekarang Anda harus menulis yang berikut ini:required init(coder aDecoder: NSCoder!)
Tautan ini memiliki kedua implementasinya:
Cepat:
Tujuan C
Tautan ini memiliki kode untuk memulai viewcontroller di storyboard yang sama
sumber
Jawaban akashivskyy bekerja dengan baik! Tetapi, jika Anda mengalami kesulitan untuk kembali dari pengontrol tampilan yang disajikan, alternatif ini dapat membantu. Itu berhasil untuk saya!
Cepat:
Obj-C:
sumber
Kode Swift 4.2 yang diperbarui adalah
sumber
Ini bekerja dengan baik untuk saya ketika saya menaruhnya di AppDelegate
sumber
Jika Anda ingin menyajikannya secara modern, Anda harus memiliki sesuatu seperti di bawah ini:
sumber
Saya ingin menyarankan cara yang jauh lebih bersih. Ini akan berguna ketika kita memiliki banyak storyboard
1. Buat struktur dengan semua storyboard Anda
2. Buat ekstensi UIStoryboard seperti ini
Berikan pengenal papan cerita sebagai nama kelas, dan gunakan kode di bawah ini untuk instantiate
sumber
Swift 4:
sumber
Jika Anda memiliki Viewcontroller yang tidak menggunakan storyboard / Xib, Anda dapat mendorong ke VC khusus ini seperti panggilan di bawah ini:
sumber
Cepat 3
sumber
Saya tahu ini adalah thread lama, tapi saya pikir solusi saat ini (menggunakan pengidentifikasi string hardcoded untuk tampilan controller yang diberikan) sangat rentan terhadap kesalahan.
Saya telah membuat skrip waktu pembuatan (yang dapat Anda akses di sini ), yang akan membuat cara kompiler aman untuk mengakses dan membuat instance pengendali tampilan dari semua storyboard dalam proyek yang diberikan.
Sebagai contoh, lihat kontroler bernama VC1 di Main.storyboard akan dipakai seperti:
sumber
Tidak peduli apa yang saya coba, itu tidak akan berhasil untuk saya - tidak ada kesalahan, tetapi tidak ada pengontrol tampilan baru di layar saya juga. Tidak tahu mengapa, tetapi membungkusnya dalam fungsi batas waktu akhirnya membuatnya berfungsi:
sumber
Cepat 5
sumber
Saya membuat perpustakaan yang akan menangani ini lebih mudah dengan sintaks yang lebih baik:
https://github.com/Jasperav/Storyboardable
Hanya mengubah Storyboard. Cepat dan biarkan
ViewControllers
sesuaiStoryboardable
.sumber