Xcode - 'NSUnknownKeyException' düzeltmek için neden:… Bu sınıf X "hatası anahtar kod kodlama uyumlu anahtar değeri değil mi?


1172

Sınıfımda oluşturulmuş bir UILabelile bağlantı kurmaya çalışıyorum IBOutlet.

Uygulamam aşağıdaki hata ile kilitleniyor.

Ne anlama geliyor?

Nasıl düzeltebilirim?

*** Yakalanmayan istisna 'NSUnknownKeyException' nedeniyle uygulamayı sonlandırma, nedeni: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: bu sınıf, XXX anahtarının kod değeriyle uyumlu anahtar değer değil.'


11
pedrotorres doğru. Evet bu doğru. Bir UITableViewCell yapıyorsanız, IB'de Dosya Sahibi'ni NSObject'e ve UITableViewCell'Class'ı tanımladığınız .h sınıfına dönüştürmeyi unutmayın.
giuseppe

3
Böyle bir sorunla karşılaştığınızda ve rahatsız edici anahtar bir çıkış yerine bir eylem olduğunda, büyük olasılıkla yanlışlıkla çıkış değişkeni adınız yerine eylem işlev adınıza referansta bulunan bir çıkışınız olur .
Alex Yursha

2
Hata mesajındaki anahtarın adının (OP'nin 'XXXX' olarak adlandırdığı) nib dosyanızdaki bir şeye verdiğiniz ad olduğunu fark etmelisiniz. Bu, aramanızı daraltmanıza yardımcı olacaktır.
kris

Rdar: // 22105925'ten Apple'dan bu hataları derleme zamanında daha açık hale getirmesini istedim. :)
jtbandes

DERHAL sorunu çözmek için nasıl! stackoverflow.com/a/13812660/294884 harika ipucu
Fattie

Yanıtlar:


980

Görünüm denetleyiciniz xib'inizde yanlış sınıfa sahip olabilir.

Projenizi indirdim.

Aldığınız hata

'NSUnknownKeyException', nedeni: '[<UIViewController 0x3927310> setValue: forUndefinedKey:]: bu sınıf, anahtar dizesi için kodlama uyumlu anahtar değeri değil.'

Bunun yerineSecond görünüm denetleyicisinin yerineMainWindow.xib bir sınıfa sahip olması neden olur . Doğru sınıfa geçmek sorunu çözer.UIViewControllerSecondView

Bu arada, Objective-C'de "string" gibi isimlere sahip olmak kötü bir uygulamadır. Çalışma zamanı adlandırma çarpışmasını davet eder. Uygulama dışı uygulamalarda bile bunlardan kaçının. Çarpışmaları adlandırmak çok zor olabilir ve zaman kaybetmek istemezsiniz.

Bu hatanın bir başka olası nedeni: Xcode bir denetleyiciden diğerine kopyalayıp yapıştırırken, Xcode bir şekilde bu öğeyi düzenleyip yeni denetleyiciye yeniden bağladıktan sonra bile orijinal denetleyiciye olan bağlantıyı korur.

Bu hatanın başka bir olası nedeni:

Kötü Çıkış.

Ya gelmiş kaldırıldı veya yeniden adlandırılmış sizin de bir çıkış adını .hdosyası.

Bunu .xibveya .storyboarddosyanın Bağlantı Denetçisini kaldırın .

Bir olası neden daha

(Benim durumumda) o bağlanabilir özelliklerini için bağlanabilir özelliklerini ve ayar değerleriyle (yani gölge, yarıçap vb köşe) ile UIView Uzatma sonra (nedense) UIView uzantısından bu özellikleri kaldırmak ancak aşağıdaki <userDefinedRuntimeAttributes>(bir xml kalmıştır 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>

Çözüm:foo.storyboard > Kaynak Kodu Olarak Aç> keyPath'e göre ara (yani shadowRadius) öğesini sağ tıklayın > </userDefinedRuntimeAttributes>Soruna neden olanı silin


9
Ayrıca ucun "view" çıkışını dosya sahibinin view çıkışına bağlamayı unutmayın (UIViewController'dan devralınan özel sınıfınızın view outlet). Bu, "Yer Tutucular" altındaki "Dosya Sahibi" nden "Nesneler" altındaki "görünüm" e sürüklenip görünüm çıkışı seçilerek yapılabilir.
Nirma

1
Tüm sınıfın zaten ayarlandığından emin oldum, ancak NSUnknownKeyException hala çıkıyor :(
Zennichimaro

1
Interface Builder'ı bile kullanmıyorum ve hala bu hatayı alıyorum. Neler olduğuna dair bir fikrin var mı?
sudo

12
Boşver. İki şeyden dolayıydı: Xcode, projeden kaldırılsa ve simülatörün önbelleğe alınmasına rağmen Ana film şeridime hala erişiyordu. Görsel senaryo taslaklarını veya NIB'leri kullanmanızı kesinlikle tavsiye etmiyorum - gülünç derecede sorunlu.
sudo

5
@Josh Lol. Her zaman xcode yerel bir uygulama oluşturmak için motivasyon çalışır her zaman benimle nasıl bir şey yapmak için anlamaya çalışırken bir gün harcama sona erer. Ben ac # dev ben son zamanlarda Xamarin ve Telerik (nativescript) teklifleri bakıyordum.
Muffin Man

1524

Xib'inizde kötü bir bağlantı olabilir.

Bu hatayı birçok kez yaşadım. TechZen'in yanıtı bu durumda kesinlikle doğru olsa da, başka bir yaygın neden, .h / .m dosyasında zaten uçtaki Dosya Sahibine bağladığınız bir IBOutlet özelliğinin adını değiştirmektir .

Uçunuzdan:

  1. IB'de nesneyi seçin ve 'Bağlantılar Müfettişi'ne gidin.
  2. 'Referans Çıkışları' altında, nesnenizin hala eski özellik adına bağlı olmadığından emin olun ... öyleyse , referansı silmek ve yeniden oluşturmak için küçük 'x' işaretini tıklayın.

    resim açıklamasını buraya girin

Storyboard kullanıyorsanız başka bir yaygın neden, UIButton'unuz birden fazla atamaya sahip olabilir (Çözüm, uç için neredeyse aynıdır):

  1. Film şeridinizi açın ve UIButton'a sağ tıklayın
  2. Bu düğmeye birden fazla ata / ref olduğunu göreceksiniz. Küçük "x" ile "Ana ..." gri pencerelerden birini kaldırın:

    örnek 2


1
Teşekkürler! Benim durumumda aynı manzaraya 2 çıkış vardı ve eski olandan kurtulmak ve yeni olana görünümü bağlamak istisna sona erdi.
Mark Patterson

benimki iki kez kopyalandı. Diğer projedeki bağlantılara asıldığını düşünerek Pro sürümünden (Lite sürümünden) sürükleyip bıraktıktan sonra her birinin bağlantısını kesmeye başladım. Ben yinelenen rastladı, ve kopukluk yapmak için 3 tıklama aldı, ben içtenlikle ben bunu 3 gün önce yapılmasını diledi. Oh şey- böyle bir geliştiricinin hayatı.
aremvee

UIButton'un birden fazla görevi olması sorunu vardı. Bu benim sorunumu çözdü.
mythicalcoder

Ben de bu problemi yaşadım. Yalnızca denetimler yerine belirli görünümlerde çıkış bağlantılarını kontrol etmeyi unutmayın. Benim durumumda, denetimler yanlış bağlantıları göstermiyordu = /
Augusto Carmo

Ben benzer bir hata ile ben henüz sayfası henüz GUI kullanılarak oluşturulan olmazdı yanlış ViewController hızlı dosyaya bir düğme çıkış
bağladım

114

Bu hatadan kurtulmak için uygulamayı simülatörden / iPhone'dan silmek zorunda kaldım.


1
+1 bu düzeltti benim için. IB kullanılan bazı kodları temizliyordum. Koddan bir düğmeyi sildiğimde, bu düğmeye nib dosyalarında hiç başvurulmadığında bile hata oluşmaya devam etti (en azından görebildiğim).
PazarPazartesi

2
Aynı ada sahip iki uygulamada hata ayıklarsanız bunun gerekli olduğunu düşünüyorum.
Anton

Evet, XIB'den bir şey simülatörde önbelleğe alınmış gibi görünüyor, bu da eski uygulamayı silmek istemediğiniz için yükseltmeleri test ediyorsanız bir acıdır.
Carlos P

XIB dosyamı silerken bu sorunla karşılaştım. Bu sorunu çözdü.
balboa

4
Uygulama silme işe yaramazsa, XCode DerivedData klasörünü silmeyi deneyin. bu da yanlış bir xib dosyasını önbelleğe alabilir. XCode'u açın -> Tercihler -> Konumlar -> DerivedData klasörünü açın ve Çöp Kutusuna sürükleyin.
Philip Fung

107

Bir tablo için özel bir ViewCell uygulamaya çalışırken bu hatayla karşılaştım. Ben XIB için Görünüm denetleyicisi vurgulanmış ve CellView öğelerine bağlandığında "bu sınıf anahtar için kod değeri kodlama uyumlu değil anahtar" hata neden oldu Ben silindikten sonra bu hatadan kurtuldu.

Aşağıdaki görüntüdeki bağlantıları silin. Dosya Sahibi vurgulandığında denetçideki bağlantıları silin

Yalnızca Tablo Görünümü Hücresi ile bağlantılara sahip olduğunuzdan emin olun. Kontrol etmek için tablo görünümü hücresine tıklayın ve INSPECTOR'da bağlantılarınızı arayın.

Tablo Görünümü Hücresi vurgulandığında bağlantı burada olmalıdır


4
Bu benim için yaptı, çok teşekkürler. Sol sütunda "Dosya Sahibi" seçildiğinde bağlantıları dışarıda bıraktım, sonra özel hücrem seçildi ve yeniden takıldı. Başarı!
Rogare

Bu xcode7 ile bile çalışır, sadece sağ panel "Bağlantı müfettişi" kullanın. Çıkışı tableviewcell'den ve etiketten çıkarın, ardından tekrar ekleyin ve her şey işe yarayacaktır.
lifeisfoo

3
Bu çalışıyor, ancak FileOwner'ın ayarlanmadığından emin olmalısınız! Dosya sahibi NSObject olarak kalmalıdır. stackoverflow.com/questions/13793162/…
devjme

Aynı cevap beni iki kez kurtardı!
wm.p1us

98

Bazen bunun "Hedeften Devral" ile ilgisi vardır. Bu değerin ayarlanması gerekir. Tek hedefli uygulamalarla Hedeften Devral'ı seçebilirsiniz. Birden fazla hedefiniz varsa, istediğiniz hedefi seçin.

resim açıklamasını buraya girin


Bu cevap belirli bir dava için bana yardımcı oldu. Birden fazla hedefi olan eski bir obj-c projesi üzerinde çalışmaya devam etmeliyim. Swift'te özel bir UITableViewCell oluşturdum ve aynı hatayla karşılaştım. "Hedeften Devral" seçeneğini etkinleştirerek işe yaradı. Teşekkür ederim!
magohamoth

Modül her zaman doğru ayarlanmamıştır; örneğin, sınıfı gerçekten oluşturmadan önce sınıf adını doldurursanız.
Johan

Ben IDE bu bayrağı otomatik olarak kontrol etmedi böylece sonunda "Enter" tuşuna basmadan sınıf adını doldurdum. Bu konuda 1 saat boşa. Teşekkür ederim.
MatPag

Obj-c'de bu tür bir hatayla hiç karşılaşmadım. Ama teşekkürler gizemi çözdü.
Pradeep Kachhawaha

bu neden 3. sayfaya gömüldü?
Sergio

65

Evrensel bir uygulama değil, yalnızca iPhone uygulamasıysa, aşağıdaki alanın boş olduğundan emin olun:

Hedefler> Özet> iPhone / iPod Dağıtım Bilgisi> Ana Arayüz

Orada bir xib belirtirseniz çöker.


2
Evet, benim için buydu. Yeni bir başlangıç ​​görünümü denetleyicisi eklemek için etrafta dolaşırken bunu yeni sınıfa / uca ayarladım. Görünüm çıkışını bağladıktan sonra bu hatayı vuruyordu. Bu alanı temizlemek sorunu düzeltti.
terriblememory

Bu benim için çalıştı. Ayrıca çalışması için eski sürümü cihazdan / simülatörden silmek zorunda olduğumu unutmayın.
jimt

Teşekkürler - bu benim sorunumdu. İPad film şeridi dosyamı yeniden adlandırmıştım ve projemin tercihlerinde güncelleme yapmadım.
RobertJoseph

2
Teşekkür ederim! Bu benim için çözdü. (Boş olacak Ana Arayüz alanını değiştirdikten sonra simülatör uygulamayı silmek zorunda Basitçe alan önbellek kırmaya simülatörü zorlamak olmadığını değişiyor..)
çulluk

Evrensel bir uygulamadan sadece bir iphone uygulamasına bir şey değiştirdiğimi hatırladım ve bu hatayı düzeltti!
Justin

59

Bu hata, zaten bağlı bir Interface Builder nesnesinin sahibinin kaynağında (Dosya Sahibi) kaldırıldığını / yeniden adlandırıldığını gösterir.

Bunu düzeltmeniz gereken bir ünlem işareti görürseniz, Arayüz Oluşturucu'da Dosya Sahibine Control tıklayın .

Aşağıdaki resimde "aRemovedView" un sağ tarafında bir ünlem işareti olduğunu görebilirsiniz, çünkü zaten IB'ye bağlıyken IBOutlet görünüm nesnesini kaldırdım.

resim açıklamasını buraya girin

Bu, aşağıdaki hatayı verir: Yakalanmamış özel durum 'NSUnknownKeyException' nedeniyle sonlandırılıyor, nedeni: '[setValue: forUndefinedKey:]: bu sınıf, aRemovedView anahtarı için kodlama uyumlu anahtar değer değil .'


Teşekkür ederim! Bu benim için düzeltildi. Bu sorunu uzun zamandır yaşıyorum ve sıfırdan başlamak dışında nasıl düzelteceğini bilmiyordum. Bu, IBOutlets'i görünüm denetleyicisinden sildi, ancak sahiplerine hala başvurulduğunu / bağlandığını bilmiyordu (bu durumda arayüz oluşturucusunda "Görünüm Denetleyicisi" - Xcode 6).
Ira Herman

41

Aynı sorunu yaşadım ve TechZen'in cevabı gerçekten şaşırtıcı olsa da durumuma başvurmakta zorlandım.

Sonunda etiketi Dosya Sahibi yerine Nesneler altında listelenen Denetleyici (aşağıdaki resimde vurgulanır) aracılığıyla bağlayarak sorunu çözdüm .

Bu yardımcı olur umarım.

resim açıklamasını buraya girin


37

benim durumumda film şeridi kaynak kodunda bir hataydı, aşağıdaki adımları izleyin:

  1. önce hikaye tahtanızı kaynak kodu olarak açın
  2. aramak <connections>
  3. istenmeyen bağlantıları kaldır

Örneğin:

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

Gördüğünüz gibi, bunlar kod değişkenlerinizin adları ile film şeridi düzeni xml etiketleri arasındaki bağlantılardır;)


33

resim açıklamasını buraya girin resim açıklamasını buraya girin

Benim fikrim Gerard Grundy'e benziyordu. Bir XIB kullanarak özel bir UITableViewCell oluştururken, yanlışlıkla Özel Sınıf adını UITableViewCell yerine Dosya Sahibine uygulamıştım. Sınıfı tuval üzerindeki UITableViewCell'e uygulamak ve IBOutlet özelliklerimi ona bağlamak sorunu çözdü.


Ayyy dag nab it ... Bu hatayı ne sıklıkla yaptığımı düşünemiyorum. Teşekkürler lol
Benjamin

31
  1. Sadece bir IBOutletkez belirtmeniz gerekir IBOutlet, ivarınızın etiketi gereksizdir.
  2. NIB'inizi kullanarak başlatır mısınız UIViewController? Bir noktada aramalısınız[SecondView initWithNibName:@"yourNibName" bundle:nil];

Bu yardımcı oldu! Farklı bir görünüm denetleyicisinden bir özellik hakkında bir anahtar / değer kodlaması uyum hatası alıyordum. -initWithNibNameYanlış uç adı ile aradığımı ortaya koyuyor.
jlstrecker

Evet bu da bana yardımcı oldu .. ben MyCustomeViewController yerine UIViewController kullanıyordum .. ama bu tür bir hiyerarşi sorunu olabilir .. özledim özledim yerleştirilen sınıf nesnesi nedeniyle başarısız oldu ..
Yine de

Benzer bir sorunum vardı. Kazara iki özdeş IBAction girişi. Kodda, sadece UIControl (benim durumumda bir UIStepper) sağ tıklamada göstermedi. Sadece birini silmek düzeltildi.
Dave Hubbard

30

Bu bana sadece bir cihazda (iPhone) hata ayıklama yaparken oluyordu. İOS Simulator düzgün çalışıyordu. Xcode bir "Ürün-> Temiz" yapmak sorunu çözmek gibi görünüyordu, ama neden hiçbir fikrim yok.


Bu benim sorunumu çözdü. tsk2x neredeyse 3 gün baş ağrısı.
user3818576

5
Bu soruya bir cevap vermektedir. Nib'de bir şey dağıldı ve temiz bir şey yaptı. Yukarıdakilerin hepsini boşuna okudum ve denedim ve temizledim ve düzeltmeye çalıştıktan 1 saat sonra Maj'in çözümü düzeltildi. XML'de neyin buna neden olabileceğini görmek isterdim ama devam ettim.
LevinsonTechnologies

Bu gerçekten sorunu çözüyor - yukarıda çok sayıda öneri denedim ve sadece proje aniden ortaya çıkan bu hatayı düzeltti. Ugg ...
DustinB

Bu benim sorunumu düzeltmek, yukarıdaki öneriler çok denedim. Tuhaf görünüyor!
Naveen Shan

23

Aynı hata mesajını aldım ve http://www.idev101.com adresinden Kira'ya teşekkürler (!!) Bu sorunu çözmeyi başardım. Ben sadece tüm googling ve tüm bu konuların üst üste istiflendikten sonra sitesini buldum. Şimdi burada StackOverFlow geliyor ve bu kişi büyük olasılıkla bu konu Google üzerinden gelecek beri yaşadım aynı zorluğa sahip bir sonraki için gönderiyorum.

Bunu yanlış yaptığımı fark ettim:

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

Bunun yerine:

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

Nerede

DeviceViewController

Sınıfımın adı da

DeviceViewController.h 
DeviceViewController.m

Zorunda olacaksın

"import DeviceViewController.h"

örneğin başka bir UIViewController'ı çağırmak istediğiniz uygulamanızda (.m Dosyası).

Sadece benim gibi yeni başlayanlar için bariz belirten ve bu soru ile tam olarak ilgili değil gibi oy aşağı alabilir eğer ben kesinlikle üzgün değilim ama şimdi bu hata mesajının cevabı için 4 (?!?) Saat arıyordum . Bu harika olurdu 1 veya 2 kişiye yedek olabilir eğer :)

Not: Kodun diğer UIViewController'ı yüklemeye nasıl devam ettiği ile ilgilenenler için:

    [self presentViewController:deviceViewController animated:YES completion:nil];

Orada tüm adımlar için TEŞEKKÜRLER, Xcode 5 kullanıyordum ve sadece varsayılan olarak film şeridi ekleyebileceğiniz gibi elle nasıl bir uç ekleyeceğini bilmiyordum .... Bazı talimatlar var ama sizinki kadar ayrıntılı değil. Gerçekten yardımcı oldu!
Pittfall

"Bunu yanlış yaptım ..." teşekkürler, bu gerçekten aptalca bir hata yüzünden ilk defa çok fazla
para harcamıyorum

23

Kontrolün sürüklenip bir çıkış veya eylem oluşturduğunuz ve silmeyi unuttuğunuz gerçeğinden gelebilir. Kodu silseniz veya yeterince cmd + Z yapmış olsanız bile, film şeridinizin bağlantı denetçisine gitmeniz ve oluşturduğunuz eylemin veya çıkışın hala burada olup olmadığını görmeniz gerekir.


Teşekkürler! Ben Xcode üzerinde bir n00b ve haydut bağlantıları bulmak için biraz zaman aldı. Xcode 9.2'de film şeridi görünümünde öğeye sağ tıklayıp "Referans çıkışları" na bakabilirsiniz.
kunigami

21

Diğer cevaplara baktığımızda, bu hataya neden olabilecek birçok şey var gibi görünüyor. İşte bir tane daha.

Eğer sen

  • özel bir görünüme sahip olmak
  • @IBInspectable özelliği ekledi
  • ve sonra sildi

Sonra benzer bir hata alabilirsiniz

[Özel Görünümünüz] üzerinde (xxx) kullanıcı tanımlı denetlenen özellik ayarlanamadı ...: bu sınıf, [xxx] anahtarı için kod değeriyle uyumlu anahtar değer değil.

Çözüm eski özelliği silmektir.

resim açıklamasını buraya girin

Sınıfınız için Kimlik denetçisini açın, Kullanıcı Tanımlı Çalışma Zamanı Öznitelikleri altında özellik adını seçin ve eksi düğmesine (-) basın.


Bu sayfaya çok sık geldim ... Bu sefer bu çözüm başardı! Ama silmek gibi eski özelliği kulağa garip olarak aslında çöküyor bir başka bir ViewController üzerinde olduğu gibi, neden hiçbir fikrim yok.
Cin

15

Bu, görünüm denetleyicim aslında bir .xib dosyasına sahip olduğunda, ancak şimdi programlı olarak oluşturulduğunda bana oluyor.

Bu projeden .xib dosyasını silmiş olmama rağmen. İPhone / iPad kullanıcıları bu görünüm denetleyicisi için bir .xib dosyaları içerebilir.

Bir .xib dosyasını yüklemeye çalışmak genellikle bu çökmeye neden olur:

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

Programlı olarak oluştururken çözüm şu olabilir:

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

12

Kimlik Denetçisindeki Görünüm Denetleyicisinin "Modül" özelliği beklediğinizden farklı olabilir. Ayrıca hedef listenize yeni sınıfların eklendiğinden emin olun.


benim durumumdan beri oy kullanıyorum. Swift ve Storyboard'ları kullanıyorum. Yeni bir oluşturma hedefi oluşturduğumda (bir yapı varyantı yapmak için), uygulama yeni varyantta çalışmadı, ilk sırada TAMAM çalıştı. Uygulama, Modül adının bir şekilde ilk hedeften modüle ayarlandığı bir View Controller'a çöktü. View Controlerers çalışırken Current - <modül adı burada> idi . Bu durumda modül adını silmeniz gerekir.
Mixaz

11

İki hedefi olan bir proje için benzer bir sorunum vardı (kendi MainWindow XIB'si ile). Benim için bu hataya neden olan temel sorun, UIViewController sınıfının ikinci projenin kaynak listesinde yer almamasıydı. Yani arabirim oluşturucu MainWindow.xib'de belirtmeme izin verdi, ancak çalışma zamanında sistem sınıfı bulamadı.

Yani söz konusu UIViewController sınıfına cmd tıklayın ve 'Hedefler' sekmesinde olup olmadığını iki kez kontrol edin.


9

Sadece buna eklemek için, çünkü ben de bu hatayı alıyordum. Tüm bu cevapları incelemek çoğunlukla kullanıcı arayüzü ve film şeridi öğeleriyle çalışmak için geçerlidir. Orijinal posterin kullanıcı arayüzü ile çalıştığını biliyorum ama bu hatanın olası nedenlerini ararken çoğunlukla tüm sorular bu soruya geri dönerek diğerlerinin kopya olarak kapatılması veya sadece bir hikaye tahtasındaki şeyleri bağlamayla ilgili sorunların olmasıyla sonuçlanacak. çözümümü ekle.

Swift 2'de bir web servisini kodlamaya çalışıyordum. Gerekli tüm proxy nesnelerini ve taslaklarını oluşturmuştum. Döndürülen XML'de dolaşırken, her şeyden gelen NSObjectve setValue:forKeybunları kullanan nesnelerimi dinamik olarak somutlaştırıyordum . Her zaman setValue:forKeybu hata ile havaya uçurdu bir özelliği ayarlamak çalıştı.

Ben hiçbir zaman bu (örn uğraşıyordu her tip için bir switch deyimi vardı Bool?, CShort?, String?) ve geçtim ve tek tip nesne üzerinde ne teslim ve sonra bu tür değer dönüştürülür ve bunu belirlemeye çalıştı her XML düğüm için setValue:forKey.

Sonunda tüm bu setValue:forKeysatırları yorumlamaya başladım ve defaultswitch deyim durumumun işe yaradığını gördüm String?.

Sonunda bunu anladım olamaz ile opsiyonel hızlı türlerini kullanmak setValue:forKeyonlar gibi bir Objective-C tipi doğrudan eşleme yoksa String?veya NSNumber?. Doğrudan bir eşleme olduğu CShort?için her türünü değiştirdim NSNumber?. Çünkü Bool?benim durumumda kullanmak Boolve başlatmak benim için iyi oldu false. Diğerleri bu lükse sahip olmayabilir.

Her neyse, bu kadar umut verici bir baş ağrısı, benzer bir sorunu olan ve bu soruya yönlendirilmeye ve kendilerine "Kullanıcı arayüzünde hiçbir şey yapmıyorum!"

Son olarak bir kez daha yinelemek için Anahtar / değer Kodlaması seçeneklerle çalışmaz. Aşağıda bir yerde buldum ama bunu kim yayınladı özür dilerim nerede unuttum ve bunu nerede buldum hatırladı, ancak hayatımı kurtardı kredi verecek:

KVC'yi İsteğe Bağlı Int özelliğinde kullanamazsınız, çünkü KVC Kakao / Objective-C'dir ve Objective-C bir İsteğe Bağlı Int göremez - Objective-C ile köprülenmez. Objective-C yalnızca Objective-C ile köprülenen türleri görebilir:

NSObject'ten türetilen sınıf türleri

@objc ile karşılaşan sınıf türleri

Köprülenen hızlı yapılar


1
Bir Swift bool değerini Cocoa bağları üzerinden bağlamaya çalışıyorsanız, bunu @objc yönergesi ile göstermeniz gerekir; aksi halde bu hatayı alırsınız. Bu en iyi cevap olmalı.
jvarela

9

"Bu sınıf anahtar değeri kodlama uyumlu anahtar için değil" Biraz geç biliyorum ama cevabım farklı olduğunu, bu yüzden gönderilmesi gerektiğini düşünüyor, ikinci denetleyiciyi yanlış bir şekilde itiyordum, İşte örnek

Push Controller'ı Yanlış Yol

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

Doğru yol

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

Yukarıdaki gibi bir cevap bulamadım, bu yüzden aynı sorunu olan bazılarına yardımcı olabilir


8

Bu, Xib Arabiriminden yeniden adlandırdığınız veya sildiğiniz bir bileşene başvurmak olabilir. Yeniden referans vermek benim için çalışıyor.


8

Çoğaltılmış projemde bu sorunu yaşadım ve 2 yeri kontrol ederek çözdüm:

1- Listede .m dosyanızın bulunduğundan emin olun -> Proje - Derleme Aşamaları - Derleme Kaynakları
2- Bundan sonra arayüz oluşturucusuna gidin (muhtemelen bu sadece IB ile oluşan bir hatadır) ve tüm özelliklerin, etiketlerin, görüntülerin bağlantısını kesin , vb ... Sonra hepsini yeniden bağlayın. Bir özelliği kaldırdığımı fark ettim ancak hala IB'de bağlantılıydı.

Umarım bazıları için çalışır.


7

Bulduğum bir diğer "uyumlu olmayan" sorun, bir nedenden dolayı bir sınıfın iki kopyasını almayı başardığım zamandı.

Yanlış kopyaya anahtarlar ekliyordum. Interface Builder hala anahtarları gördü ve onlara bağlanmama izin verdi, ancak çalışma zamanında yeni anahtarlara sahip olmayan sınıfın diğer kopyasını kullanıyordu.

Hangi "doğru" kopya olduğunu bulmak için başka bir yerde sınıf adına XCode'un cmd tuşunu kullanarak doğru kopyaya atladım, daha sonra kullanılmayan kopyadan önce düzenlemelerimi getirdikten sonra kötü kullanılmayan kopyaları öldürdüm.

Hikayenin ahlakı: Yinelenen sınıf dosyaları kötü.


7

Bu hata başka bir şey!

İşte nasıl düzelttim. Sürüm 6.1.1 xcode ve swift kullanıyorum. Uygulamam bir sonraki ekrana atlamak için bir segue yapmaya çalıştığında bu hatayı aldım. İşte ne yaptım.

  1. Düğmenin doğru eyleme bağlı olduğundan emin olun. (Bu sorun değildi, ancak yine de kontrol etmek iyi)
  2. Düğmenin yanlışlıkla oluşturmuş olabileceğiniz herhangi bir ek eylem veya çıkış olmadığını kontrol edin. (Bu sorun değildi, ama yine de kontrol etmek iyi)
  3. Günlükleri kontrol edin ve SONRAKİ EKRAN'daki tüm düğmelerin doğru eylemlere sahip olduğundan emin olun ve herhangi bir segue varsa, benzersiz bir tanımlayıcıya sahip olduklarından emin olun. (Sorun buydu)
    • Sekmelerin birinde benzersiz bir tanımlayıcı yoktu
    • Düğmelerden birinin bir eylemi ve yanlışlıkla oluşturduğum iki çıkışı vardı.
    • Ek çıkışları silin ve bir sonraki ekrana olan sekmelerin benzersiz tanımlayıcılara sahip olduğunuzdan emin olun.

Alkış,


6

Aynı belirtiye sahiptim. Temel neden, kaynak dosyamın "Hedef Üyeliği" nin doğru hedefe ayarlanmamış olmasıdır. Bunun, sınıfımın oluşturulmayacak ve uygulamama eklenmeyeceği anlamına geliyor.

Düzeltmek için:

  1. .M dosyanızı vurgulayın.
  2. Sağ bölmede Dosya Denetçisi'ni seçin.
  3. "Hedef Üyelik" bölümünün altında, uygun oluşturma hedefinin işaretlendiğinden emin olun.

Umarım bu birisine yardım eder.


6

IBOutlets ile sorunlara neden olan özel bir UIViewController alt sınıfınız varsa, hatadan kurtulmak için bulduğum tek adım kümesi

.1 Sınıfı UIViewController olarak değiştirme

.2 Tüm çıkışların bağlantısını kesin (şimdi sarı uyarı üçgeni olacaktır) - sadece sorunlu çıkış (ları) sökmek yeterli olabilir.

.3 Tüm standart adımları uygulayın - ↑ ⌘K, Türetilmiş Verileri silin (, namaz paspasları, endişe boncukları)

.4 Uygulamayı başlatın - sorunlu sahneye gidin.

.5 Uygulamayı öldür, Arayüz Oluşturucu'ya geri dön, sınıfı özel sınıf isminle değiştir.

.6 Çıkışlarınızı yeniden bağlayın.

Uygulamayı başlatın ve bu normalde anahtar / değer uyumluluk sorunlarını çözecektir.


Bu, Storyboard düzenleyicisine bir sahne kopyalanırken ve yapıştırılırken işe yaradı.
Mizmor

5

Benim durumumda. Birleştirdikten sonra xib dosyalarında eksik çıkışlar yoktu.

Shift + Command + K

sorunumu çözdü. Projemi temizledim ve yeniden inşa ettim.


4

Benim durumumda, bu yanlış Nib referansı nedeniyle oldu:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];

1
Görünüm denetleyicisinin sınıfını yeniden adlandırdığımda ve uç adının da değişmesi gerektiğini unuttuğumda bana olur. Uç adı sadece bir dize olduğundan derleyici hatası yoktur.
kris

3

Storyboard'larda bu hatayı alıyordum. Yukarıdaki çözüm sorun gibi görünmüyordu, bu yüzden görünüm denetleyicisini silip tekrar ekledim (ve elbette segue'i yeniden bağlayıp sınıfı yeniden atama). Gerçekten ne olduğunu bilmiyorum, ama bu başlamadan kısa bir süre önce ilişkili görünüm denetleyicisi sınıfını yeniden adlandırmıştım, bu yüzden belki de bir şey barındırmıştı.


Bu hatayı tekrar aldım. Bu sefer sınıfım atanmış yeni bir boş tablo görünümü denetleyicisi oluşturdum, çalışmayanı yalnız bıraktım ve segue'i ona taşıdım. Bu işe yaradı. Daha sonra görünümdeki her öğeyi tekrar başarısız olana kadar yavaşça kopyaladım. Bu kez sorun bir seçici için bazı "Kullanıcı Tanımlı Çalışma Zamanı Nitelikleri" atamış olduğu ortaya çıktı (Ben kodda bunu yapmak zorunda olmaz, böylece hiçbir fikrim seçici başlatmak için onları kullanabilirsiniz düşünüyordum ). Bunu kaldırmak sorunu çözdü. Bu hata gerçekten korkunç, umarım gelecekteki bir sürümde geliştirildi!
Simetrik

3

Ben de aynı problemi yaşadım. Simülatörü sıfırladım. Düğme kontrolünü kaldırma ve ekleme. ve sonunda temiz. :) Yığın taşması sayesinde. Kodum nasıl tamamlandı ve çalışmaya başlıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.