Menggunakan Swift 1.1 dan Xcode 6.2.
Saya memiliki UIStoryboard yang berisi UIViewController
subclass kustom tunggal . Di atasnya, saya memiliki @IBOutlet
koneksi tipe UIView
dari pengontrol itu ke UIView
subclass di storyboard. Saya juga memiliki saluran serupa untuk subview dari pandangan itu. Lihat gambar A.
Tetapi pada waktu berjalan, properti ini nihil (Gambar B). Meskipun saya telah meyakinkan saya telah menghubungkan outlet di Interface Builder.
Pikiran :
- Apakah mungkin karena saya menggunakan subclass dari subclass ada yang salah dengan inisialisasi? Saya tidak menimpa penginisialisasi apa pun
awakeFromNib:
tidak dipanggil karena alasan tertentu- Mungkin itu tidak terhubung ke subview di subview
Hal yang telah saya coba:
@IBOutlet
Jenis item yang cocok dan storyboard persis (bukanUIView
)- Menghapus properti dan outlet dan menambahkannya kembali
Gambar A *
Gambar B
* Kode yang dikaburkan Figure A
adalah:
@IBOutlet private var annotationOptionsView: UIView!
@IBOutlet private var arrivingLeavingSwitch: UISegmentedControl!
Terima kasih.
clearView
Saya berharap menjadi nol. Ini adalah sesuatu yang belum saya refactor. Lihat juga catatan kaki untuk gambar A. @ShaanSingh Seharusnya! karena koneksi dari storyboard (seharusnya) disetel pada waktu proses dan tidak boleh nol.let vc = UIStoryboard(name: "LocationPickerModal", bundle: nil) .instantiateViewControllerWithIdentifier("LocationPickerModalViewController") as LocationPickerModalViewController
Jawaban:
Biasanya ini terjadi karena pengontrol tampilan Anda belum memuat hierarki tampilannya. Pengontrol tampilan hanya memuat hierarki tampilan saat ada sesuatu yang mengirimkan
view
pesan kepadanya . Sistem melakukan ini saat tiba waktunya untuk benar-benar meletakkan hierarki tampilan di layar, yang terjadi setelah hal-hal sepertiprepareForSegue:sender:
danviewWillAppear:
telah kembali.Karena VC Anda belum memuat hierarki tampilan, outlet Anda masih nihil.
Anda dapat memaksa VC untuk memuat hierarki tampilannya dengan mengatakan
_ = self.view
.sumber
viewWillAppear:
dipanggil, pertama kali saya melakukan sesuatu dengan outlet itu. Mengakses tampilan tidak melakukan apa pun untuk saya. Masih nihil.UIViewcontroller.loadViewIfNeeded()
adalah metode yang tepat untuk digunakan di sini.Sudahkah Anda mencoba menjalankan Product> Clean. Memecahkan masalah yang sangat mirip untuk saya.
sumber
DerivedData
folder untuk proyek tersebut.Apakah Anda memberi contoh pengontrol tampilan Anda dari Storyboard atau NIB, atau apakah Anda memberi contoh langsung melalui penginisialisasi?
Jika Anda membuat instance kelas Anda langsung dengan penginisialisasi, outlet tidak akan terhubung. Interface Builder membuat instance yang disesuaikan dari kelas Anda dan mengenkode instance tersebut ke dalam NIB dan Storyboards untuk decoding berulang, itu tidak menentukan kelas itu sendiri. Jika ini adalah masalah Anda, Anda hanya perlu mengubah kode tempat Anda membuat pengontrol untuk menggunakan metode di UIStoryboard, atau UINib.
sumber
UIStoryboard
instance dan memanggilnyainstantiateViewControllerWithIdentifier
.Papan cerita tidak mengenali hal-hal UI lebih lanjut yang saya tambahkan ke dalamnya. Pada waktu berjalan semua referensi nihil. Jadi saya membersihkan folder data turunan saya dan kemudian koneksi tersebut berfungsi kembali.
sumber
viewDidLoad()
semua koneksi dibuat, tetapi diviewWillAppear()
hampir semuanyanil
(terkadang satu atau dua masih terhubung). Saya mencoba segalanya dan akhirnya menghapus folder data turunan, membangun kembali, dan semuanya baik-baik saja.Ini terjadi pada saya dengan sel tampilan koleksi kustom saya. Ternyata saya harus mengganti metode registerClassforReuseIdentifier saya dengan registerNib. Itu memperbaikinya untuk saya.
sumber
Ini terjadi pada saya karena saya secara tidak sengaja memberi contoh pengontrol tampilan saya secara langsung alih-alih memberi contoh melalui papan cerita. Jika Anda memberi contoh langsung melalui
MyViewController()
maka outlet tidak akan terhubung.sumber
Dalam kasus saya, itu terjadi karena saya mengganti
loadView
metode di subkelas ViewController saya, tetapi lupa menambahkan[super loadView]
Saat Anda mengganti
loadView
metode ini, Anda bertanggung jawab untuk memulai subview Anda. Karena Anda menimpanya, tampilan dari pembuat antarmuka tidak berkesempatan untuk dikonversi ke objek kakao dan dengan demikian outlet tetap nihil.Jika Anda mengimplementasikan loadView di subkelas pengontrol tampilan, Anda bertanggung jawab untuk memuat elemen UI dari storyboard / xib ke dalam kode.
Atau panggil saja
Sehingga superclass mendapat kesempatan untuk memuat storyboard / xib ke dalam kode.
sumber
Anda dapat memanggil
controller.view
untuk memaksa memuat tampilan guna menginisialisasi IBOutlets, lalu Anda akan dapat menetapkan nilainya.sumber
Jika Anda membuat instance
view controller
melalui programatis. Kemudian coba buat seperti di bawah inibukannya secara langsung
Ini berhasil untuk saya.
sumber
Bagi saya, ini terjadi ketika saya secara tidak sengaja mendeklarasikan kelas pengontrol tampilan saya sebagai
(yaitu sebagai
UINavigationController
bukan aUIViewController
).Xcode tidak menangkap kesalahan ini, kelas tampaknya membangun baik, dan fungsi override seperti
viewDidLoad
,viewWillAppear
, dll semua bekerja dengan benar. Tapi tidak ada satupun yangIBOutlet
terhubung.Mengubah deklarasi menjadi
memperbaikinya sepenuhnya.
sumber
Saya mengalami masalah ini baru-baru ini! Inilah pikiran saya. Masalahnya bukan tentang storyboard Anda atau masalah tautan apa pun. Ini tentang bagaimana Anda memulai ViewController Anda. Terutama saat Anda menggunakan Swift. (Hampir tidak ada apa pun di editor saat Anda membuat file kelas)
Dengan hanya menggunakan
init()
dari kelas super tidak dapat memulai apa pun yang Anda kerjakan dengan papan cerita. Jadi yang perlu Anda lakukan adalah mengubah inisialisasi ViewController. Replacelet XXViewController = XXViewController()
bylet XXViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("XXViewController") as! XXViewController
This memberi tahu program untuk pergi ke storyboard menemukan XXViewController dan memulai semuanyaIBOutlet
di storyboard Anda.Semoga bantuan ini ~ GL
sumber
2019, SATU KEMUNGKINAN UNTUK MASALAH MENGERIKAN INI:
Katakanlah Anda mungkin memiliki tampilan kontainer yang menunjukkan semacam jam. Jadi kamu punya
Kelas Jam: UIViewController
Anda benar-benar menggunakannya di sejumlah tempat di aplikasi .
Di layar utama, di layar detail, di layar edit.
Anda memiliki aplikasi modern seperti snapchat yang rumit.
Bahkan,
Clock
sebenarnya bisa dimuat lebih dari sekali pada waktu yang bersamaan suatu tempat di layar yang sama . (Mungkin tersembunyi dalam beberapa kasus.)Anda mulai mengerjakan satu contoh
Clock
di salah satu dari banyak papan cerita Anda.Di papan cerita itu Anda menambahkan label, Label Baru.
Biasanya Anda menambahkan outlet dalam kode. Semuanya harus bekerja. Semua gerai lainnya bekerja dengan sempurna.
Anda pasti punya menautkan outletnya.
Tapi aplikasi macet dengan NewLabel sebagai nihil.
Xcode dengan jelas memberi tahu Anda "Anda lupa menghubungkan stopkontak".
Alasannya adalah ini ......... Anda hanya memiliki "Label Baru" di satu satu storyboard yang menggunakan Jam!
Kecelakaan itu sebenarnya dari >>> tempat lain <<<< Anda menggunakan Jam !!!!
Xcode tidak memberi tahu Anda bahwa kecelakaan itu berasal dari tempat lain sama sekali, bukan dari tempat Anda bekerja!
Kecelakaan itu sebenarnya bukan dari tempat Anda bekerja - melainkan dari tempat lain storyboard , di mana tidak ada item "Label Baru" di storyboard itu !!!
Membuat frustrasi.
sumber
Untuk Swift 3.
sumber
Anda perlu memuat hierarki tampilan terlebih dahulu untuk membuat instance outlet di storyboard. Untuk ini, Anda bisa memanggil metode loadView atau loadViewIfNeeded secara manual.
sumber
Dalam kasus saya, aplikasi tiba-tiba mulai mogok. Debugging itu mengungkapkan bahwa semua outlet masih
nil
pada saat ituviewDidLoad()
.Aplikasi saya masih menggunakan ujung pena (bukan papan cerita) untuk sebagian besar pengontrol tampilan. Semuanya ada di tempatnya, semua outlet terhubung dengan benar. Saya memeriksa ulang.
Kami biasanya memberi contoh pengontrol tampilan kami sebagai
... yang karena alasan tertentu tampaknya berfungsi selama .xib dinamai sama dengan kelas pengontrol tampilan (meskipun tidak yakin bagaimana cara kerjanya. tidak memanggil
init(nibName:bundle:)
dengan argumen nil, atau menimpainit()
untuk melakukannya padaself
seperti itu biasanya disarankan ...).Jadi saya mencoba menelepon secara eksplisit
... hanya untuk disambut dengan kesalahan pengecualian waktu proses:
Dan kemudian , saya melihatnya:
Kotak centang "Target Keanggotaan" dari file .xib tidak dicentang.
Pasti terjadi saat menyelesaikan salah satu konflik penggabungan yang sering terjadi terkait file proyek Xcode.
Apple pasti perlu menghadirkan format file proyek yang lebih ramah SCM.
sumber
Solusi kerja 100% untuk membuat ViewControllers dari XIB tanpa StoryBoards
7.1.
7.2.
7.3.
sumber
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
dan memanggil langkah 7.2 denganself
langsung di kelas CustomViewController.Periksa koneksi IBOutlet Anda jika terhubung ke Pemilik file atau tampilan. Mungkin ada kesalahan.
sumber
Kasus lain:
Outlet Anda tidak akan disetel hingga tampilan pengontrol tampilan benar-benar dibuat, yang dalam kasus Anda mungkin terjadi tidak lama setelah initWithNibName: bundle: —pada saat itu mereka masih nihil. Setiap pengaturan yang Anda lakukan yang melibatkan outlet tersebut harus terjadi dalam metode -viewDidLoad pengontrol tampilan Anda.
sumber
Bagi saya, saya memiliki kesalahan yang sama pada storyboard yang dilokalkan, sebuah elemen ditambahkan di beberapa lokal dan tidak di yang lain, jadi saya tidak memiliki referensi untuk elemen itu ketika beralih ke lokal elemen yang hilang, saya harus menghapus pelokalan (redundan) untuk storyboard itu menggunakan https://stackoverflow.com/a/42256341/1356559 .
sumber
Bagi saya, ini mengecewakan karena
containerView
nihil.Ini kode saya dengan Crash .
Hal yang hilang memanggil
super.loadView()
. Jadi menambahkannya memecahkan masalah bagi saya.Kode Tetap :
sumber
Saya mengalami masalah serupa ketika saya sebelumnya menambahkan register (_: forCellReuseIdentifier :) untuk sel khusus setelah saya menentukan pengenal di storyboard. Punya kode ini dalam fungsi viewDidLoad (). Setelah saya menghapusnya, itu berfungsi dengan baik.
sumber
Kasus lain yang baru saja saya hadapi. Saya mengubah nama kelas saya untuk UIViewController, tetapi saya lupa mengganti nama file .xib tempat antarmuka dibuat.
Setelah saya menangkap ini dan membuat nama file mencerminkan nama kelas, semuanya baik-baik saja!
Saya harap itu membantu seseorang.
sumber
Punya satu lagi ...
Jika Anda memiliki kelas khusus untuk UITableViewCell tetapi lupa untuk menentukan Kustom dalam Gaya sel.
sumber
Anda dapat memvalidasi jika tampilan is dimuat.
sumber
.h
dan.m
lihat file pengontrolsumber
Secara tidak sengaja saya membuat subclass pengontrol tampilan saya dengan
AVPlayerViewController
alih - alihUIViewController
. Dengan memutar ulang agarUIViewController
semuanya kembali normal. Ini akan membantu.sumber
Saya memiliki masalah yang sama setelah menyalin kelas (ditautkan ke xib) untuk digunakan kembali dengan kelas viewcontroller lain (ditautkan ke storyboard). Saya lupa untuk menghapus
dan
metode.
Setelah menghapusnya, outlet saya mulai berfungsi.
sumber
Saya melihat Anda menggunakan
ViewController
!? diViewController
kelas Anda harus menggunakan-viewDidLoad
, bukan-awakeFromNib
,-awakeFromNib
digunakan untukUIView
kelassumber
Periksa apakah Anda memiliki outlet yang hilang atau terputus.
sumber
Jika Anda memiliki dua
main.storyboards
dan Anda membuat perubahan ke yang salah, ini bisa terjadi. Ini dapat terjadi kapan pun Anda menghubungkan outlet dari yang tidak berdasarstoryboard
.sumber