Saya mencoba menghubungkan UILabel
dengan yang IBOutlet
dibuat di kelas saya.
Aplikasi saya macet dengan kesalahan berikut.
Apa artinya ini?
Bagaimana saya bisa memperbaikinya?
*** Mengakhiri aplikasi karena pengecualian 'NSUnknownKeyException' tanpa alasan, alasan: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: kelas ini bukan nilai kunci yang sesuai dengan kode untuk kunci XXX.'
ios
macos
cocoa
cocoa-touch
interface-builder
Guillaume Dubois
sumber
sumber
Jawaban:
Pengontrol tampilan Anda mungkin memiliki kelas yang salah di xib Anda.
Saya mengunduh proyek Anda.
Kesalahan yang Anda dapatkan adalah
Ini disebabkan oleh
Second
pengontrol tampilan dalamMainWindow.xib
memiliki kelasUIViewController
bukanSecondView
. Mengubah ke kelas yang benar menyelesaikan masalah.Ngomong-ngomong, adalah praktik yang buruk untuk memiliki nama seperti "string" di Objective-C. Ini mengundang tabrakan penamaan runtime. Hindari mereka bahkan dalam sekali aplikasi latihan. Memberi nama tabrakan bisa sangat sulit untuk dilacak dan Anda tidak ingin membuang waktu.
Alasan lain yang mungkin untuk kesalahan ini: ketika menyalin & menempel elemen dari satu pengontrol ke yang lain, Xcode entah bagaimana menyimpan tautan itu ke pengontrol asli, bahkan setelah mengedit & menautkan kembali elemen ini ke pengontrol baru.
Alasan lain yang mungkin untuk kesalahan ini:
Outlet buruk.
Anda telah menghapus atau mengganti nama nama outlet di
.h
file Anda .Hapus di
.xib
atau.storyboard
Inspektur Koneksi file.Satu lagi kemungkinan alasan
(Dalam kasus saya) Ekstensi UIView dengan properti bindable dan nilai pengaturan untuk properti bindable (yaitu bayangan, radius sudut, dll.) Lalu hapus properti tersebut dari ekstensi UIView (untuk beberapa alasan) tetapi yang berikut
<userDefinedRuntimeAttributes>
tetap dalam xml (darifoo.storyboard
):Solusi: Klik kanan pada
foo.storyboard
> Open as Source Code> search by keyPath (yaitu shadowRadius)> Hapus</userDefinedRuntimeAttributes>
yang menyebabkan masalahsumber
Anda mungkin memiliki koneksi yang buruk di xib Anda.
Saya mengalami kesalahan ini berkali-kali. Sementara jawaban TechZen benar dalam kasus ini, penyebab umum lainnya adalah ketika Anda mengubah nama properti IBOutlet di .h / .m yang telah Anda sambungkan ke File's Owner di nib.
Dari ujung pena Anda:
Di bawah 'Outlet Referensi' pastikan bahwa objek Anda masih belum terhubung ke nama properti lama ... jika ya, klik kecil 'x' untuk menghapus referensi dan membangun lagi.
Penyebab umum lainnya jika Anda menggunakan Storyboard, UIButton Anda mungkin memiliki lebih dari satu tugas (Solusi hampir sama dengan nib):
Anda akan melihat bahwa ada lebih dari satu penetapan / ref pada tombol ini. Hapus salah satu dari "Main ..." windows greyed dengan "x" kecil:
sumber
Saya harus menghapus aplikasi dari simulator / iPhone untuk menghilangkan kesalahan ini.
sumber
Saya memiliki kesalahan ini ketika saya mencoba menerapkan ViewCell kustom untuk tabel. Ketika saya menyorot View controller untuk XIB dan terhubung ke elemen-elemen di CellView menyebabkan kesalahan "kelas ini bukan nilai kunci yang sesuai dengan kode untuk kunci" setelah saya menghapus ini ia menghilangkan kesalahan.
Hapus koneksi pada gambar di bawah ini.
Pastikan Anda hanya memiliki koneksi dengan Table View Cell. Untuk memeriksa klik pada sel tampilan tabel dan di INSPECTOR cari koneksi Anda.
sumber
Terkadang ini ada hubungannya dengan "Inherit From Target" Anda. Nilai itu harus ditetapkan. Dengan aplikasi target tunggal, Anda cukup memilih Mewarisi Dari Target. Jika Anda memiliki lebih dari satu target pilih target yang diinginkan.
sumber
Jika ini hanya aplikasi iPhone, bukan aplikasi universal, pastikan bidang berikut ini kosong:
Target> Ringkasan> Info Penempatan iPhone / iPod> Antarmuka Utama
Jika Anda menentukan xib di sana, crash.
sumber
Kesalahan ini menunjukkan bahwa objek Interface Builder yang sudah terhubung dihapus / diganti namanya di sumber pemiliknya (Pemilik File).
Klik kontrol pada Pemilik File di Pembuat Antarmuka jika Anda melihat tanda seru Anda harus memperbaikinya.
Pada gambar di bawah ini Anda dapat melihat bahwa "aRemovedView" memiliki tanda seru di sebelah kanannya, itu karena saya menghapus objek tampilan IBOutlet saat itu sudah terhubung di IB.
Ini memberikan kesalahan berikut: Menghentikan aplikasi karena pengecualian yang tidak tertangkap 'NSUnknownKeyException', alasan: '[setValue: forUndefinedKey:]: kelas ini bukan nilai kunci yang sesuai dengan kode untuk kunci. aRemovedView.'
sumber
Saya memiliki masalah yang sama dan walaupun jawaban TechZen mungkin memang menakjubkan saya merasa sulit untuk menerapkannya pada situasi saya.
Akhirnya saya menyelesaikan masalah dengan menghubungkan label melalui Pengendali yang tercantum di bawah Objek (disorot pada gambar di bawah) daripada melalui Pemilik File .
Semoga ini membantu.
sumber
dalam kasus saya itu adalah kesalahan dalam kode sumber storyboard, ikuti langkah-langkah ini:
<connections>
Sebagai contoh:
Seperti yang Anda lihat, ini adalah koneksi antara nama variabel kode Anda dan tag xml tata letak storyboard;)
sumber
Perbaikan saya mirip dengan Gerard Grundy. Dalam membuat UITableViewCell kustom menggunakan XIB, saya telah keliru menerapkan nama Kelas Kustom untuk Pemilik File alih-alih ke UITableViewCell. Menerapkan kelas ke UITableViewCell di kanvas dan menghubungkan properti IBOutlet saya untuk menyelesaikan masalah.
sumber
IBOutlet
satu kali,IBOutlet
label ivar Anda tidak perlu.UIViewController
? Pada titik tertentu Anda harus menelepon[SecondView initWithNibName:@"yourNibName" bundle:nil];
sumber
-initWithNibName
dengan nama pena yang salah.Ini hanya terjadi pada saya ketika melakukan debug pada perangkat (iPhone). Simulator iOS berfungsi dengan baik. Melakukan "Produk-> Bersihkan" dari Xcode tampaknya dapat menyelesaikan masalah, tetapi saya tidak tahu mengapa.
sumber
Saya punya pesan kesalahan yang sama persis dan terima kasih (!!) kepada Kira dari http://www.idev101.com saya bisa menyelesaikan tantangan. Saya hanya menemukan situsnya setelah googling dan menumpuk semua utas ini. Saya sekarang memposting di sini untuk yang berikutnya yang datang ke StackOverFlow dan memiliki tantangan yang sama yang saya miliki karena orang itu kemungkinan besar akan datang ke utas ini melalui Google.
Saya menyadari, bahwa saya salah membuat ini:
Alih-alih INI:
Dimana
Apakah nama Kelas saya juga dikenal sebagai
Anda harus melakukannya
dalam implementasi Anda (File .m) di mana Anda ingin memanggil misalnya UIViewController lain.
Saya sama sekali tidak menyesal jika saya hanya menyatakan yang jelas untuk pemula seperti saya dan mungkin mendapatkan suara karena ini tidak persis terkait dengan pertanyaan tetapi saya sedang mencari 4 (?!?) Jawaban langsung sekarang untuk jawaban atas pesan kesalahan ini . Jika saya dapat menyimpan ini untuk 1 atau 2 orang itu akan menjadi luar biasa :)
PS: Bagi mereka yang tertarik dengan bagaimana kode berlanjut untuk memuat UIViewController lainnya:
sumber
Itu bisa berasal dari fakta bahwa Anda telah mengontrolnya dengan menyeret dan membuat saluran keluar atau tindakan, dan lupa menghapusnya. Bahkan jika Anda menghapus kode, atau bahkan jika Anda telah membuat cukup cmd + Z, Anda harus masuk ke inspektur koneksi papan cerita Anda dan melihat apakah tindakan atau outlet yang Anda buat masih di sini atau tidak.
sumber
Melihat jawaban lain sepertinya ada banyak hal yang dapat menyebabkan kesalahan ini. Ini satu lagi.
Jika kamu
Maka Anda juga mungkin mendapatkan kesalahan yang mirip dengan
Solusinya adalah menghapus properti lama.
Buka inspektur Identitas untuk kelas Anda, pilih nama properti di bawah Atribut Runtime yang Ditentukan Pengguna, dan tekan tombol minus (-).
sumber
Ini terjadi pada saya ketika pengontrol tampilan saya awalnya memiliki file .xib, tetapi sekarang dibuat secara terprogram.
Meskipun saya telah menghapus file .xib dari proyek ini. Pengguna iPhone / iPad dapat berisi file .xib untuk viewcontroller ini.
Mencoba memuat file .xib biasanya menyebabkan kerusakan ini:
Solusi saat membuatnya secara terprogram mungkin ini:
sumber
Properti "Modul" View Controller di Identity Inspector mungkin berbeda dari yang Anda harapkan. Pastikan juga bahwa kelas baru ditambahkan ke daftar target Anda.
sumber
Saya memiliki masalah serupa untuk proyek yang memiliki dua target (dengan MainWindow XIB mereka sendiri). Masalah mendasar yang menyebabkan kesalahan ini bagi saya adalah bahwa kelas UIViewController tidak termasuk dalam daftar sumber daya proyek kedua. Yaitu pembangun antarmuka memungkinkan saya untuk menentukannya di MainWindow.xib, tetapi pada saat runtime sistem tidak dapat menemukan kelas.
Yaitu klik cmd pada kelas UIViewController yang dimaksud dan periksa kembali apakah itu termasuk dalam tab 'Target'.
sumber
Hanya untuk menambah ini, karena saya mendapatkan kesalahan ini juga. Menjawab semua jawaban ini tampaknya paling sesuai untuk bekerja dengan UI dan storyboard. Saya tahu poster asli tampaknya bekerja dengan UI tetapi ketika mencari kemungkinan alasan untuk kesalahan ini sebagian besar semua pertanyaan mengarah kembali ke pertanyaan ini dengan yang lain ditutup sebagai duplikat atau hanya memiliki masalah dengan menghubungkan hal-hal di storyboard jadi saya akan tambahkan solusi saya.
Saya sedang bekerja pada pengkodean layanan web di Swift 2. Saya telah membangun semua objek proxy dan bertopik yang diperlukan. Ketika saya mengulang-ulang XML yang dikembalikan saya secara dinamis instantiating objek saya, yang semuanya berasal
NSObject
dan gunakansetValue:forKey
pada mereka. Setiap kalisetValue:forKey
mencoba untuk menetapkan properti itu meledak dengan kesalahan ini.Aku punya pernyataan switch untuk setiap jenis aku sedang berhadapan dengan (misalnya
Bool?
,CShort?
,String?
) dan untuk setiap node XML aku pergi melalui dan memeriksa apa jenis itu pada objek dan kemudian dikonversi nilai untuk jenis itu dan berusaha untuk mengaturnya dengansetValue:forKey
.Akhirnya saya mulai mengomentari semua
setValue:forKey
baris ini dan mendapati bahwadefault
case statement switch saya berhasilString?
.Saya akhirnya menemukan bahwa Anda tidak dapat menggunakan tipe swift opsional dengan
setValue:forKey
kecuali mereka memiliki pemetaan langsung ke tipe Objective-C sepertiString?
atauNSNumber?
. Saya akhirnya mengubah semuaCShort?
jenisNSNumber?
karena memiliki pemetaan langsung. KarenaBool?
dalam kasus saya, saya boleh menggunakanBool
dan menginisialisasi sajafalse
. Orang lain mungkin tidak memiliki kemewahan itu.Pokoknya sakit kepala apa yang semoga ini membantu orang lain yang memiliki masalah serupa dan terus diarahkan ke pertanyaan ini dan berkata pada diri mereka sendiri, "Saya tidak melakukan apa pun di UI !!".
Jadi terakhir untuk mengulangi sekali lagi Key-Value Coding tidak bekerja dengan opsional. Di bawah ini saya akhirnya menemukan suatu tempat tetapi saya lupa di mana begitu kepada siapa pun yang memposting ini saya meminta maaf dan akan memberikan kredit jika saya ingat di mana saya menemukan ini tetapi itu menyelamatkan hidup saya:
sumber
"kelas ini bukan nilai kunci yang sesuai kode untuk kunci" Saya tahu ini agak terlambat tapi jawaban saya berbeda jadi saya pikir perlu diposkan, saya mendorong pengontrol kedua dengan cara yang salah, Berikut ini contoh
Cara yang Salah untuk Menekan Kontroler
Jalan yang benar
Saya tidak menemukan jawaban seperti di atas sehingga mungkin dapat membantu seseorang memiliki masalah yang sama
sumber
Itu mungkin kasus referensi komponen dari Xib Interface yang telah Anda ganti namanya atau hapus. Referensi ulang berfungsi untuk saya.
sumber
Saya baru saja mengalami masalah ini dalam proyek duplikat dan diselesaikan dengan memeriksa 2 tempat:
1- Pastikan Anda memiliki file .m dalam daftar -> Proyek - Bangun Fase - Kompilasi Sumber
2- Setelah itu, buka pembuat antarmuka (mungkin ini adalah kesalahan yang terjadi dengan hanya IB) dan putuskan tautan semua properti, label, gambar , dll ... Lalu tautkan kembali semua. Saya menyadari bahwa saya telah menghapus atribut tetapi masih tertaut di IB.
Semoga berhasil untuk beberapa.
sumber
Masalah "tidak patuh" yang saya temukan adalah ketika saya berhasil memiliki dua salinan kelas untuk beberapa alasan.
Saya menambahkan kunci ke salinan yang salah. Interface Builder masih melihat kunci dan biarkan saya menghubungkannya, tetapi saat runtime itu menggunakan salinan lain dari kelas yang tidak memiliki kunci baru.
Untuk menemukan salinan mana yang "benar", saya menggunakan cmd-klik XCode pada nama kelas di tempat lain untuk melompat ke salinan yang benar, kemudian saya membunuh salinan yang tidak terpakai yang buruk (setelah membawa suntingan saya dari salinan yang tidak digunakan terlebih dahulu).
Moral dari cerita: file kelas duplikat buruk.
sumber
Kesalahan ini adalah sesuatu yang lain!
Inilah cara saya memperbaikinya. Saya menggunakan xcode Versi 6.1.1 dan menggunakan swift. Saya mendapatkan kesalahan ini setiap kali aplikasi saya mencoba melakukan segue untuk melompat ke layar berikutnya. Inilah yang saya lakukan.
Bersulang,
sumber
Saya memiliki gejala yang sama. Penyebab utama adalah bahwa "Keanggotaan Target" untuk file sumber saya tidak disetel ke target yang benar. Saya berasumsi itu berarti kelas saya tidak akan dibangun dan disertakan dalam aplikasi saya.
Untuk memperbaikinya:
Semoga ini bisa membantu seseorang di luar sana.
sumber
Jika Anda memiliki subkelas UIViewController khusus dengan IBOutlets yang menyebabkan masalah, satu-satunya rangkaian langkah yang saya temukan untuk benar-benar menghilangkan kesalahan adalah
.1 Ubah kelas menjadi UIViewController
.2 Putuskan sambungan semua outlet (mereka semua akan memiliki segitiga peringatan kuning sekarang) - mungkin cukup hanya untuk memutuskan outlet yang bermasalah.
.3 Lakukan semua langkah standar - ↑ ⌘K, hapus Data Turunan (, sajadah, tasbih khawatir)
.4 Luncurkan aplikasi - pergi ke adegan bermasalah.
.5 Bunuh aplikasinya, kembali ke Interface Builder, ubah kelas kembali ke nama kelas kustom Anda.
.6 Hubungkan kembali outlet Anda.
Luncurkan aplikasi & ini biasanya akan menyelesaikan masalah kepatuhan nilai kunci.
sumber
Dalam hal ini. Saya tidak kehilangan outlet di file xib setelah bergabung.
memecahkan masalah saya. Saya membersihkan proyek saya dan membangun kembali.
sumber
Dalam kasus saya, ini disebabkan oleh referensi Nib yang salah:
sumber
Saya mendapatkan kesalahan ini dengan storyboard. Solusi di atas tampaknya tidak menjadi masalah jadi saya akhirnya menghapus view controller dan menambahkannya kembali (dan tentu saja menghubungkan kembali segue dan menugaskan kembali kelas) yang memperbaikinya. Saya tidak tahu apa itu sebenarnya, tapi saya telah mengganti nama kelas pengontrol tampilan terkait sesaat sebelum ini dimulai, jadi mungkin itu telah menyiram sesuatu.
sumber
Saya mendapat masalah yang sama. Saya mengatur ulang simulator. Menghapus dan menambahkan kontrol tombol. dan akhirnya membuat bersih. :) Berkat stack overflow. Entah bagaimana kode saya menjadi ok dan mulai bekerja.
sumber