Xcode - Bagaimana cara memperbaiki 'NSUnknownKeyException', alasan: ... kelas ini tidak sesuai dengan kode kunci untuk kesalahan kunci X "?

1172

Saya mencoba menghubungkan UILabeldengan yang IBOutletdibuat 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.'

Guillaume Dubois
sumber
11
pedrotorres benar. Ya ini benar. Jika Anda melakukan UITableViewCell, di IB ingatlah untuk membuat Pemilik File ke NSObject, dan UITableViewCell'Class ke kelas .h yang Anda tentukan.
giuseppe
3
Ketika Anda menghadapi masalah seperti itu dan kunci yang menyinggung adalah tindakan daripada outlet maka kemungkinan besar Anda memiliki outlet yang keliru merujuk nama fungsi aksi Anda alih-alih nama variabel outlet Anda .
Alex Yursha
2
Anda harus memperhatikan bahwa nama kunci dalam pesan kesalahan (OP menyebutnya 'XXXX') adalah nama yang Anda berikan pada sesuatu di file nib Anda. Itu akan membantu mempersempit pencarian Anda.
Keris
Saya mengajukan rdar: // 22105925 meminta Apple untuk membuat kesalahan ini lebih jelas saat membangun. :)
jtbandes
bagaimana sebenarnya SEGERA MEMECAHKAN masalahnya! stackoverflow.com/a/13812660/294884 tip fantastis
Fattie

Jawaban:

980

Pengontrol tampilan Anda mungkin memiliki kelas yang salah di xib Anda.

Saya mengunduh proyek Anda.

Kesalahan yang Anda dapatkan adalah

'NSUnknownKeyException', alasan: '[<UIViewController 0x3927310> setValue: forUndefinedKey:]: kelas ini bukan nilai kunci yang sesuai dengan kode untuk string kunci.'

Ini disebabkan oleh Secondpengontrol tampilan dalam MainWindow.xibmemiliki kelas UIViewControllerbukanSecondView . 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 .hfile Anda .

Hapus di .xibatau .storyboardInspektur 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 (dari foo.storyboard):

<userDefinedRuntimeAttributes>
  <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
      <color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
      <real key="value" value="50"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
      <point key="value" x="5" y="5"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
      <real key="value" value="16"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
      <real key="value" value="0.0"/>
  </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>

Solusi: Klik kanan pada foo.storyboard> Open as Source Code> search by keyPath (yaitu shadowRadius)> Hapus </userDefinedRuntimeAttributes>yang menyebabkan masalah

Hassan Tareq
sumber
9
Juga jangan lupa untuk menyambungkan "view" outlet nib ke outlet view pemilik file (Outlet tampilan kelas kustom Anda diwarisi dari UIViewController). Ini dapat dilakukan dengan menyeret kontrol dari "Pemilik File" di bawah "Tempat Pemegang" ke "melihat" di bawah "Objek" dan memilih outlet tampilan.
Nirma
1
Saya sudah memastikan semua kelas sudah diatur, tetapi NSUnknownKeyException masih keluar :(
Zennichimaro
1
Saya bahkan tidak menggunakan Interface Builder, dan saya masih mendapatkan kesalahan ini. Adakah yang tahu apa yang terjadi?
sudo
12
Sudahlah. Itu karena dua hal: Xcode masih mengakses storyboard Utama saya meskipun sudah dihapus dari proyek, dan simulator telah di-cache. Saya sangat merekomendasikan menggunakan storyboard atau NIB - mereka sangat bermasalah.
sudo
5
@ Astaga Lol. Setiap kali saya bekerja motivasi untuk membuat aplikasi asli di xcode selalu berakhir dengan saya menghabiskan satu hari mencoba mencari cara untuk melakukan apa pun. Saya ac # dev jadi saya telah melihat penawaran dari Xamarin dan Telerik (asli) akhir-akhir ini.
The Muffin Man
1524

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:

  1. Pilih objek dalam IB dan pergi ke 'Inspektur Koneksi'.
  2. 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.

    masukkan deskripsi gambar di sini

Penyebab umum lainnya jika Anda menggunakan Storyboard, UIButton Anda mungkin memiliki lebih dari satu tugas (Solusi hampir sama dengan nib):

  1. Buka storyboard Anda dan klik kanan tombol UIB
  2. Anda akan melihat bahwa ada lebih dari satu penetapan / ref pada tombol ini. Hapus salah satu dari "Main ..." windows greyed dengan "x" kecil:

    contoh 2

OhadM
sumber
1
Terima kasih! Dalam kasus saya, saya memiliki 2 outlet dengan tampilan yang sama, dan menyingkirkan yang lama dan menghubungkan tampilan ke yang baru mengakhiri pengecualian.
Mark Patterson
milik saya digandakan dua kali. Saya mulai memutuskan koneksi masing-masing setelah saya menyeret dan menjatuhkan dari versi Pro (dari versi Lite) berpikir itu tergantung pada koneksi di proyek lain. Ketika saya menemukan duplikat, dan butuh 3 klik untuk membuat pemutusan, saya dengan tulus berharap saya melakukannya 3 hari sebelumnya. Oh well- begitulah kehidupan seorang dev.
aremvee
Saya memiliki masalah bahwa UIButton memiliki lebih dari satu tugas. Ini menyelesaikan masalah saya.
mitos pembuat
Saya punya masalah ini juga. Jangan lupa untuk memeriksa koneksi outlet dalam tampilan tertentu, bukan hanya superview. Dalam kasus saya, superview tidak menunjukkan koneksi yang salah = /
Augusto Carmo
Saya memiliki kesalahan yang sama ketika saya menghubungkan outlet tombol ke file swift ViewController yang salah yang halamannya belum dibuat menggunakan GUI
brw59
114

Saya harus menghapus aplikasi dari simulator / iPhone untuk menghilangkan kesalahan ini.

Steve Rogers
sumber
1
Beri ini +1 untuk saya. Saya sedang membersihkan beberapa kode yang menggunakan IB. Ketika saya menghapus tombol dari kode kesalahan terus muncul bahkan ketika tombol ini tidak direferensikan sama sekali dalam file nib (setidaknya yang bisa saya lihat).
SundayMonday
2
Saya menemukan ini diperlukan jika Anda men-debug dua aplikasi yang kebetulan memiliki nama yang sama.
Anton
Yap, sepertinya sesuatu dari XIB di-cache di simulator, yang merepotkan jika Anda menguji upgrade karena Anda sebenarnya tidak ingin harus menghapus aplikasi lama.
Carlos P
Saya mengalami masalah ini menghapus file XIB saya. Ini memperbaiki masalah.
balboa
4
Jika menghapus aplikasi tidak berfungsi, coba hapus folder XCode DerivedData. yang dapat men-cache file xib yang salah. Buka XCode -> Preferensi -> Lokasi -> Buka folder DerivedData dan seret ke Sampah.
Philip Fung
107

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. Hapus koneksi di inspektur ketika Pemilik File disorot

Pastikan Anda hanya memiliki koneksi dengan Table View Cell. Untuk memeriksa klik pada sel tampilan tabel dan di INSPECTOR cari koneksi Anda.

Koneksi harus ada di sini saat Table View Cell disorot

uplearnedu.com
sumber
4
Ini berhasil untuk saya, terima kasih banyak. Saya xed out koneksi ketika "File's Owner" dipilih di kolom kiri, lalu pilih sel kustom saya dan memasangnya kembali. Keberhasilan!
Rogare
Bahkan dengan xcode7 ini berfungsi, cukup gunakan panel kanan "Connections inspector". Lepaskan outlet dari tableviewcell dan dari label, lalu tambahkan kembali dan semuanya akan berfungsi.
lifeisfoo
3
Ini berfungsi tetapi Anda perlu memastikan FileOwner tidak siap !! Pemilik file harus tetap NSObject. stackoverflow.com/questions/13793162/…
devjme
Jawaban yang sama menyelamatkan saya dua kali!
wm.p1us
99

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.

masukkan deskripsi gambar di sini

Shruti Thombre
sumber
Jawaban ini membantu saya untuk kasus tertentu. Saya harus terus bekerja pada proyek obj-c lama dengan banyak target. Saya membuat UITableViewCell kustom di Swift dan saya memiliki kesalahan yang sama. Dengan mengaktifkan "Mewarisi Dari Target" itu berhasil. Terima kasih!
magohamoth
Modul tidak selalu diatur dengan benar; mis. jika Anda mengisi nama kelas sebelum benar-benar membuat kelas.
Johan
Saya telah mengisi nama kelas tanpa menekan tombol "Enter" di bagian akhir sehingga IDE tidak memeriksa flag ini secara otomatis. Terbuang 1 jam untuk ini. Terima kasih.
MatPag
Tidak pernah menemukan kesalahan jenis ini di obj-c. Tapi terima kasih sudah memecahkan misterinya.
Pradeep Kachhawaha
mengapa ini terkubur di halaman ke-3?
Sergio
65

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.

erkanyildiz
sumber
2
Ya, itu untuk saya. Sementara menggapai-gapai untuk menambahkan controller tampilan startup baru saya mengatur ini ke kelas baru / nib. Setelah mengaitkan outlet tampilan saya memukul kesalahan ini. Mengosongkan bidang ini memperbaikinya.
terriblememory
Ini berhasil untuk saya. Perhatikan bahwa saya juga harus menghapus versi lama dari perangkat / simulator agar dapat berfungsi.
persis
Terima kasih - ini masalah saya. Saya telah mengganti nama file storyboard iPad saya dan tidak memperbarui di prefs proyek saya.
RobertJoseph
2
Terima kasih! Ini menyelesaikannya untuk saya. (Saya harus menghapus aplikasi dari simulator setelah mengubah bidang Antarmuka Utama menjadi kosong. Cukup mengubah bidang itu tidak memaksa simulator untuk memecahkan cache.)
snipe
Saya ingat bahwa saya mengubah hal-hal dari aplikasi universal menjadi aplikasi hanya iphone dan ini memperbaiki kesalahan!
Justin
59

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.

masukkan deskripsi gambar di sini

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.'

Tibidabo
sumber
Terima kasih! Ini memperbaikinya untuk saya. Saya sudah mengalami masalah ini sejak lama dan tidak tahu cara memperbaikinya selain memulai dari awal. Ini dia, IBOutlet dihapus dari pengontrol tampilan, tetapi tidak tahu mereka masih direferensikan / ditautkan di pemilik (dalam hal ini "View Controller" di pembuat antarmuka - Xcode 6).
Ira Herman
41

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.

masukkan deskripsi gambar di sini

Eric Brotto
sumber
37

dalam kasus saya itu adalah kesalahan dalam kode sumber storyboard, ikuti langkah-langkah ini:

  1. pertama buka papan cerita Anda sebagai kode sumber
  2. pencarian untuk <connections>
  3. hapus koneksi yang tidak diinginkan

Sebagai contoh:

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

Seperti yang Anda lihat, ini adalah koneksi antara nama variabel kode Anda dan tag xml tata letak storyboard;)

diberi namrouti
sumber
33

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

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.

Ashack
sumber
Ayyy tidak tahu ... Tidak percaya seberapa sering saya melakukan kesalahan ini. Terima kasih lol
Benjamin
31
  1. Anda hanya perlu menentukan IBOutletsatu kali, IBOutletlabel ivar Anda tidak perlu.
  2. Apakah Anda membuat NIB Anda menggunakan Anda UIViewController? Pada titik tertentu Anda harus menelepon[SecondView initWithNibName:@"yourNibName" bundle:nil];
kubi
sumber
Ini membantu! Saya mendapatkan kesalahan kepatuhan kode-nilai kunci tentang properti dari pengontrol tampilan yang berbeda. Ternyata saya menelepon -initWithNibNamedengan nama pena yang salah.
jlstrecker
Ya ini membantu saya juga .. saya menggunakan UIViewController alih-alih MyCustomeViewController .. tapi ini semacam masalah hierarki mungkin .. introspeksi gagal karena objek miss ditempatkan kelas .. Terima kasih lagian
Futur
Saya punya masalah serupa. Dua entri IBAction identik secara tidak sengaja. Tidak muncul dalam kode, hanya di klik kanan UIControl (A UIStepper dalam kasus saya). Hanya menghapus satu yang memperbaikinya.
Dave Hubbard
30

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.

Mayor
sumber
Ini menyelesaikan masalah saya. tsk2x hampir 3 hari sakit kepala.
user3818576
5
Itu memang memberikan jawaban untuk pertanyaan itu. Sesuatu kacau di Nib dan melakukan pembersihan menyelesaikannya. Saya membaca dan mencoba semua hal di atas tanpa hasil dan kemudian membersihkannya, dan setelah 1 jam mencoba memperbaikinya, solusi Maj memperbaikinya. Saya akan senang melihat apa yang disebabkan oleh XML ini tapi saya sudah pindah.
LevinsonTeknologi
Ini memang menyelesaikan masalah - saya mencoba banyak saran di atas dan hanya melakukan pembersihan proyek kesalahan ini yang tiba-tiba mulai terjadi. Ugg ...
DustinB
Ini memperbaiki masalah saya, saya mencoba banyak saran di atas. Sepertinya aneh!
Naveen Shan
23

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:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Alih-alih INI:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Dimana

DeviceViewController

Apakah nama Kelas saya juga dikenal sebagai

DeviceViewController.h 
DeviceViewController.m

Anda harus melakukannya

"import DeviceViewController.h"

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:

    [self presentViewController:deviceViewController animated:YES completion:nil];
Yannis
sumber
TERIMA KASIH untuk semua langkah di sana, saya menggunakan Xcode 5 dan tidak benar-benar tahu cara menambahkan nib secara manual karena Anda hanya dapat menambahkan storyboard secara default .... Saya mendapat beberapa instruksi tetapi tidak sedetail milik Anda. Sangat membantu !!
Pittfall
"Saya salah membuat ini ..." terima kasih, ini bukan pertama kalinya saya menghabiskan banyak karena kesalahan yang sangat bodoh ini
tontonCD
23

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.

Ilansky Naftali
sumber
Terima kasih! Saya seorang n00b di Xcode dan butuh beberapa saat untuk menemukan tautan jahat. Di Xcode 9.2, Anda dapat mengklik kanan elemen pada tampilan storyboard dan memeriksa "Outlet referensi".
kunigami
21

Melihat jawaban lain sepertinya ada banyak hal yang dapat menyebabkan kesalahan ini. Ini satu lagi.

Jika kamu

  • memiliki tampilan khusus
  • menambahkan properti @IBInspectable
  • dan kemudian menghapusnya

Maka Anda juga mungkin mendapatkan kesalahan yang mirip dengan

Gagal menyetel (xxx) properti yang diinspeksi oleh pengguna di [Tampilan Kustom Anda] ...: kelas ini tidak sesuai dengan pengkodean nilai kunci untuk kunci [xxx].

Solusinya adalah menghapus properti lama.

masukkan deskripsi gambar di sini

Buka inspektur Identitas untuk kelas Anda, pilih nama properti di bawah Atribut Runtime yang Ditentukan Pengguna, dan tekan tombol minus (-).

Suragch
sumber
Saya sering datang di halaman ini ... Kali ini solusi ini berhasil! Tapi seaneh kedengarannya properti lama untuk dihapus sebenarnya di ViewController lain daripada dari yang crash, saya tidak tahu mengapa.
Cinn
15

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:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'

Solusi saat membuatnya secara terprogram mungkin ini:

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}
neoneye
sumber
12

Properti "Modul" View Controller di Identity Inspector mungkin berbeda dari yang Anda harapkan. Pastikan juga bahwa kelas baru ditambahkan ke daftar target Anda.

ercu
sumber
memilih sejak itu dalam kasus saya. Saya menggunakan Swift dan Storyboards. Ketika saya membuat target build baru (untuk membuat varian build) aplikasi tidak bekerja di varian baru sementara yang pertama berfungsi dengan baik. Aplikasi jatuh pada View Controller di mana nama modul entah bagaimana diatur ke modul dari target pertama, sementara dalam bekerja View Controllers itu Current - <module name here> . Anda perlu menghapus nama modul di sana dalam kasus ini.
Mixaz
11

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'.

David Carney
sumber
9

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 NSObjectdan gunakan setValue:forKeypada mereka. Setiap kali setValue:forKeymencoba 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 dengan setValue:forKey.

Akhirnya saya mulai mengomentari semua setValue:forKeybaris ini dan mendapati bahwa defaultcase statement switch saya berhasil String?.

Saya akhirnya menemukan bahwa Anda tidak dapat menggunakan tipe swift opsional dengan setValue:forKeykecuali mereka memiliki pemetaan langsung ke tipe Objective-C seperti String?atau NSNumber?. Saya akhirnya mengubah semua CShort?jenis NSNumber?karena memiliki pemetaan langsung. Karena Bool?dalam kasus saya, saya boleh menggunakan Booldan menginisialisasi saja false. 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:

Anda tidak dapat menggunakan KVC pada properti Int Opsional, karena KVC adalah Cocoa / Objective-C, dan Objective-C tidak dapat melihat Int opsional - itu tidak dijembatani ke Objective-C. Objective-C hanya dapat melihat tipe yang dijembatani ke Objective-C:

tipe kelas yang diturunkan dari NSObject

tipe kelas yang diekspos dengan @objc

Struct cepat yang dijembatani

AtheistP3ace
sumber
1
Jika Anda mencoba menghubungkan nilai bool Swift melalui binding Cocoa, Anda perlu mengeksposnya dengan direktif @objc; kalau tidak Anda memang mendapatkan kesalahan ini. Ini harus menjadi jawaban terbaik.
jvarela
9

"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

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Jalan yang benar

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Saya tidak menemukan jawaban seperti di atas sehingga mungkin dapat membantu seseorang memiliki masalah yang sama

Muhammad Ammad
sumber
8

Itu mungkin kasus referensi komponen dari Xib Interface yang telah Anda ganti namanya atau hapus. Referensi ulang berfungsi untuk saya.

MehrozKarim
sumber
8

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.

kubilay
sumber
7

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.

Jason
sumber
7

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.

  1. Diperiksa bahwa tombol terhubung ke tindakan yang benar. (Ini bukan masalah, tapi masih bagus untuk diperiksa)
  2. Pastikan tombol tidak memiliki tindakan atau outlet tambahan yang mungkin Anda buat secara tidak sengaja. (Ini bukan masalah, tapi masih bagus untuk diperiksa)
  3. Periksa log dan pastikan bahwa semua tombol di LAYAR BERIKUTNYA memiliki tindakan yang benar, dan jika ada segue, pastikan bahwa mereka memiliki pengidentifikasi unik. (Ini masalahnya)
    • Salah satu segmen tidak memiliki pengidentifikasi unik
    • Salah satu tombol memiliki aksi dan dua outlet yang saya buat secara tidak sengaja.
    • Hapus semua outlet tambahan dan pastikan bahwa Anda segues ke layar berikutnya memiliki pengidentifikasi unik.

Bersulang,

Ronaldoh1
sumber
6

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:

  1. Sorot file .m Anda.
  2. Di panel kanan, pilih File Inspector.
  3. Di bawah bagian "Keanggotaan Target", pastikan target build yang tepat dicentang.

Semoga ini bisa membantu seseorang di luar sana.

Mike M. Lin
sumber
6

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.

Damo
sumber
Ini berfungsi saat menyalin dan menempel adegan di editor Storyboard.
Mizmor
5

Dalam hal ini. Saya tidak kehilangan outlet di file xib setelah bergabung.

Shift + Command + K

memecahkan masalah saya. Saya membersihkan proyek saya dan membangun kembali.

user123456
sumber
4

Dalam kasus saya, ini disebabkan oleh referensi Nib yang salah:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
wspruijt
sumber
1
Terjadi pada saya ketika saya mengubah nama kelas controller tampilan dan lupa bahwa nama nib perlu diubah juga. Karena nama nib hanyalah sebuah string, tidak ada kesalahan kompiler.
Keris
3

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.

Simetris
sumber
Saya mendapatkan kesalahan ini lagi. Kali ini saya membuat pengontrol tampilan tabel kosong baru dengan kelas saya ditugaskan untuk itu, meninggalkan yang tidak bekerja sendirian, dan memindahkan segue ke sana. Ini berhasil. Saya kemudian secara perlahan menyalin setiap elemen dalam tampilan sampai gagal lagi. Kali ini masalahnya ternyata saya telah menetapkan beberapa "Atribut Ditentukan Pengguna Runtime" untuk pemetik (saya berpikir saya bisa menggunakannya untuk menginisialisasi pemetik jadi saya tidak perlu melakukannya dalam kode, tidak tahu apakah itu mungkin ). Menghapus itu memperbaiki masalah. Kesalahan ini benar-benar mengerikan, saya harap ini diperbaiki di rilis mendatang!
Simetris
3

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.

priya
sumber