Xcode - Jak naprawić „NSUnknownKeyException”, powód:… ta klasa nie jest zgodna z kodowaniem wartości klucza dla błędu klucza X?

1172

Próbuję połączyć UILabelz IBOutletutworzonym w mojej klasie.

Moja aplikacja ulega awarii z następującym błędem.

Co to znaczy?

Jak mogę to naprawić?

*** Zakończenie aplikacji z powodu nieprzechwyconego wyjątku „NSUnknownKeyException”, powód: „[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: ta klasa nie jest zgodna z kodowaniem wartości klucza dla klucza XXX.”

Guillaume Dubois
źródło
11
pedrotorres ma rację. Tak, to prawda. Jeśli robisz UITableViewCell, w IB pamiętaj, aby uczynić właściciela pliku NSObject, a UITableViewCell'Class klasą .h, którą zdefiniowałeś.
giuseppe
3
Gdy napotkasz taki problem, a obrażający klucz jest działaniem, a nie ujściem, najprawdopodobniej masz ujście, które błędnie odwołuje się do nazwy funkcji działania zamiast nazwy zmiennej ujścia .
Alex Yursha
2
Powinieneś zauważyć, że nazwa klucza w komunikacie o błędzie (OP nazywa ją „XXXX”) to nazwa, którą nadałeś komuś w pliku stalówki. To powinno pomóc zawęzić wyszukiwanie.
kris,
Złożyłem rdar: // 22105925, prosząc Apple o uczynienie tych błędów bardziej oczywistymi w czasie kompilacji. :)
jtbandes
jak faktycznie NATYCHMIAST rozwiązać problem! stackoverflow.com/a/13812660/294884 fantastyczna wskazówka
Fattie

Odpowiedzi:

980

Twój kontroler widoku może mieć niewłaściwą klasę w xib.

Pobrałem twój projekt.

Występuje błąd

„NSUnknownKeyException”, powód: „[<UIViewController 0x3927310> setValue: forUndefinedKey:]: ta klasa nie jest zgodna z kodowaniem wartości klucza dla ciągu klucza.”

Jest to spowodowane tym, że Secondkontroler widoku MainWindow.xibma klasę UIViewControllerzamiastSecondView . Zmiana na odpowiednią klasę rozwiązuje problem.

Nawiasem mówiąc, złym zwyczajem jest mieć w Celu-C nazwy takie jak „string”. Powoduje kolizję nazewnictwa w czasie wykonywania. Unikaj ich nawet w jednorazowych aplikacjach treningowych. Nazwy kolizji mogą być bardzo trudne do wyśledzenia i nie chcesz tracić czasu.

Inna możliwa przyczyna tego błędu: podczas kopiowania i wklejania elementów z jednego kontrolera do drugiego Xcode w jakiś sposób zachowuje ten link do oryginalnego kontrolera, nawet po edycji i ponownym podłączeniu tego elementu do nowego kontrolera.

Kolejny możliwy powód tego błędu:

Zły wylot.

Masz albo usunięte lub przemianowano nazwę wylotową w swoim .hpliku.

Usuń go w Inspektorze połączeń .xiblub .storyboardpliku.

Jeszcze jeden możliwy powód

(W moim przypadku) Rozszerzenie UIView o właściwości wiążące i wartości ustawień dla tych właściwości wiążących (tj. Cień, promień narożnika itp.), A następnie usuń te właściwości z rozszerzenia UIView (z jakiegoś powodu), ale <userDefinedRuntimeAttributes>w xml (z foo.storyboard) pozostały następujące elementy :

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

Rozwiązanie: kliknij prawym przyciskiem myszy foo.storyboard> Otwórz jako kod źródłowy> wyszukaj według keyPath (tj. ShadowRadius)> Usuń </userDefinedRuntimeAttributes>przyczynę problemu

Hassan Tareq
źródło
9
Nie zapomnij również podłączyć ujścia „widok” stalówki do ujścia właściciela pliku (ujście twojej klasy niestandardowej odziedziczone z UIViewController). Można to zrobić, przeciągając kontrolę z „Właściciela pliku” pod „Umieść uchwyty” do „widoku” w „Obiekty” i wybierając ujście widoku.
Nirma,
1
Upewniłem się, że wszystkie klasy są już ustawione, ale nadal pojawia się
wyjątek NSUnknownKeyException
1
Nawet nie używam Konstruktora interfejsów i nadal pojawia się ten błąd. Masz pomysł, co się dzieje?
sudo
12
Nieważne. Stało się tak z dwóch powodów: Xcode nadal uzyskiwał dostęp do mojej głównej scenorysu, mimo że został usunięty z projektu, a symulator miał go w pamięci podręcznej. Bardzo nie polecam używania scenariuszy lub NIB - są one absurdalnie problematyczne.
sudo
5
@Josh Lol. Za każdym razem, gdy pracuję nad motywacją do stworzenia natywnej aplikacji w xcode, zawsze kończy się to, że spędzam dzień próbując dowiedzieć się, jak coś zrobić. Jestem ac # dev, więc ostatnio przeglądałem oferty Xamarin i Telerik (nativescript).
The Muffin Man
1524

Możesz mieć złe połączenie w swoim Xib.

Miałem ten błąd wiele razy. Podczas gdy odpowiedź TechZen jest absolutnie słuszna w tym przypadku, inną częstą przyczyną jest zmiana nazwy właściwości IBOutlet w pliku .h / .m, który już podłączyłeś do właściciela pliku w stalówce.

Z twojej stalówki:

  1. Wybierz obiekt w IB i przejdź do „Inspektora połączeń”.
  2. W obszarze „Referencing Outlets” upewnij się, że obiekt nie jest nadal połączony ze starą nazwą właściwości ... jeśli tak, kliknij małe „x”, aby usunąć odwołanie i ponownie zbudować.

    wprowadź opis zdjęcia tutaj

Inną częstą przyczyną, jeśli używasz Storyboard, twój UIButton może mieć więcej niż jedno przypisanie (Rozwiązanie jest prawie takie samo jak dla stalówki):

  1. Otwórz storyboard i kliknij prawym przyciskiem myszy przycisk UIB
  2. Zobaczysz, że ten przycisk ma więcej niż jedno przypisanie / przypisanie. Usuń jedno z szarych okien „głównego ...” za pomocą małego „x”:

    przykład 2

OhadM
źródło
1
Dzięki! W moim przypadku miałem 2 wyloty tego samego widoku, a pozbycie się starego i podłączenie widoku do nowego zakończyło wyjątek.
Mark Patterson
mój został dwukrotnie skopiowany. Zacząłem rozłączać każdy po przeciągnięciu i upuszczeniu z wersji Pro (z wersji Lite), myśląc, że zawiesił się on na połączeniach w innym projekcie. Kiedy natrafiłem na duplikat i rozłączenie wymagało 3 kliknięć, szczerze żałowałem, że nie zrobiłem tego 3 dni wcześniej. No cóż - takie jest życie dewelopera.
aremvee
Miałem problem z tym, że UIButton miał więcej niż jedno zadanie. To rozwiązało mój problem.
mityczny
Też miałem ten problem. Nie zapomnij sprawdzić połączeń wylotowych w poszczególnych widokach zamiast samych widoków. W moim przypadku superwizje nie pokazywały złych połączeń = /
Augusto Carmo,
Miałem podobny błąd, gdy podłączyłem ujście przycisku do niewłaściwego pliku szybkiego ViewController, którego strona nie zostałaby jeszcze utworzona za pomocą GUI
brw59
114

Musiałem usunąć aplikację z symulatora / iPhone'a, aby pozbyć się tego błędu.

Steve Rogers
źródło
1
+1 to naprawiło dla mnie. Czyściłem trochę kodu, który używał IB. Kiedy usunąłem przycisk z kodu, błąd pojawiał się nadal, nawet jeśli ten przycisk nie był w ogóle wymieniany w plikach stalówki (przynajmniej to widziałem).
niedziela poniedziałek
2
Uważam, że jest to konieczne, jeśli debugujesz dwie aplikacje o takich samych nazwach.
Anton
Tak, wygląda na to, że coś z XIB jest buforowane na symulatorze, co jest uciążliwe, jeśli testujesz aktualizacje, ponieważ tak naprawdę nie chcesz usuwać starej aplikacji.
Carlos P
Miałem ten problem podczas usuwania mojego pliku XIB. To rozwiązało problem.
balboa
4
Jeśli usuwanie aplikacji nie działa, spróbuj usunąć folder XCode DerivedData. który może buforować niepoprawny plik xib. Otwórz XCode -> Preferencje -> Lokalizacje -> Otwórz folder DerivedData i przeciągnij go do Kosza.
Philip Fung,
107

Wystąpił ten błąd, gdy próbowałem zaimplementować niestandardowy ViewCell dla tabeli. Kiedy podświetliłem kontroler View dla XIB i podłączyłem do elementów w CellView, spowodował błąd „ta klasa nie jest zgodna z kodowaniem wartości klucza dla klucza”. Po ich usunięciu pozbyłem się błędu.

Usuń połączenia z poniższego obrazka. Usuń połączenia w inspektorze, gdy podświetlony jest Właściciel pliku

Tylko upewnij się, że masz tylko połączenia z komórką widoku tabeli. Aby to sprawdzić, kliknij komórkę widoku tabeli i w INSPEKTORZE poszukaj swoich połączeń.

Połączenie powinno być tutaj, gdy podświetlona jest komórka widoku tabeli

uplearnedu.com
źródło
4
To mi to zrobiło, wielkie dzięki. Wyłączyłem połączenia, gdy w lewej kolumnie wybrano opcję „Właściciel pliku”, a następnie wybrałem komórkę niestandardową i ponownie ją załączyłem. Sukces!
Rogare
Nawet z Xcode7 to działa, wystarczy użyć prawego panelu „Inspektor połączeń”. Usuń wylot z komórki widoku tabeli i etykiety, a następnie dodaj go ponownie i wszystko powinno działać.
lifeisfoo
3
To działa, ale musisz się upewnić, że FileOwner się nie ustawił !! Właściciel pliku powinien pozostać NSObject. stackoverflow.com/questions/13793162/…
devjme
Ta sama odpowiedź uratowała mnie dwa razy!
wm.p1us
98

Czasami ma to związek z „Dziedziczeniem z celu”. Tę wartość należy ustawić. W aplikacjach z jednym celem możesz po prostu wybrać opcję Dziedzicz od celu. Jeśli masz więcej niż jeden cel, wybierz żądany cel.

wprowadź opis zdjęcia tutaj

Shruti Thombre
źródło
Ta odpowiedź pomogła mi w konkretnym przypadku. Muszę kontynuować pracę nad starym projektem obj-c z wieloma celami. Tworzę niestandardowy UITableViewCell w Swift i miałem ten sam błąd. Włączenie „Dziedzicz z celu” działało. Dziękuję Ci!
magohamoth,
Moduł nie zawsze jest ustawiony poprawnie; np. jeśli wypełnisz nazwę klasy przed jej utworzeniem.
Johan
Wypełniłem nazwę klasy bez naciskania klawisza „Enter” na końcu, więc IDE nie sprawdzało tej flagi automatycznie. Zmarnowałem na to 1 godzinę. Dziękuję Ci.
MatPag
Nigdy nie spotkałem tego typu błędu w obj-c. Ale dzięki rozwiązanej tajemnicy.
Pradeep Kachhawaha,
dlaczego jest to zakopane na 3. stronie?
Sergio,
65

Jeśli jest to aplikacja tylko na iPhone'a, a nie uniwersalna, upewnij się, że następujące pole jest puste:

Cele> Podsumowanie> Informacje o wdrażaniu iPhone / iPod> Główny interfejs

Jeśli określisz tam Xib, zawiesza się.

erkanyildiz
źródło
2
Tak, to było dla mnie. Podczas gdy wymachuję, aby dodać nowy kontroler widoku uruchamiania, ustawiłem to na nową klasę / końcówkę. Po podłączeniu punktu widokowego napotkałem ten błąd. Wyczyszczenie tego pola naprawiło to.
terriblememory
To zadziałało dla mnie. Pamiętaj, że musiałem również usunąć starą wersję z urządzenia / symulatora, aby działała.
jimt
Dzięki - to był mój problem. Zmieniłem nazwę pliku scenariusza na iPadzie i nie zaktualizowałem go w preferencjach projektu.
RobertJoseph
2
Dziękuję Ci! To rozwiązało dla mnie. (Musiałem usunąć aplikację z symulatora po zmianie pola interfejsu głównego, aby był pusty. Po prostu zmiana tego pola nie zmusiła symulatora do zerwania pamięci podręcznej.)
snipe
Pamiętałem, że zmieniłem rzeczy z aplikacji uniwersalnej na aplikację tylko na iPhone'a i to naprawiło błąd!
Justin
59

Ten błąd wskazuje, że już podłączony obiekt Konstruktora interfejsów został usunięty / zmieniono jego nazwę w źródle właściciela (właściciela pliku).

Naciśnij klawisz Control i kliknij właściciela pliku w Konstruktorze interfejsów, jeśli zobaczysz wykrzyknik, który musisz naprawić.

Na poniższym zdjęciu widać, że „aRemovedView” ma wykrzyknik po prawej stronie, ponieważ usunąłem obiekt widoku IBOutlet, gdy był już podłączony w IB.

wprowadź opis zdjęcia tutaj

Daje to następujący błąd: zakończenie aplikacji z powodu nieprzechwyconego wyjątku „NSUnknownKeyException”, powód: „[setValue: forUndefinedKey:]: ta klasa nie jest zgodna z kodowaniem wartości klucza dla klucza aRemovedView”.

Tibidabo
źródło
Dziękuję Ci! Naprawiłem to dla mnie. Mam ten problem od dłuższego czasu i nie wiedziałem, jak to naprawić, oprócz rozpoczynania od zera. To było to, usunąłem IBOutlety z kontrolera widoku, ale nie wiedziałem, że nadal były do ​​nich odwoływane / powiązane w właścicielu (w tym przypadku „View Controller” w kreatorze interfejsów - Xcode 6).
Ira Herman
41

Miałem ten sam problem i chociaż odpowiedź TechZen może być naprawdę niesamowita, trudno mi było zastosować się do mojej sytuacji.

W końcu rozwiązałem ten problem, łącząc etykietę za pośrednictwem kontrolera wymienionego w obszarze Obiekty (podświetlone na obrazku poniżej), a nie poprzez właściciela pliku .

Mam nadzieję że to pomoże.

wprowadź opis zdjęcia tutaj

Eric Brotto
źródło
37

w moim przypadku był to błąd w kodzie źródłowym scenorysu, wykonaj następujące kroki:

  1. najpierw otwórz planszę jako kod źródłowy
  2. Szukaj <connections>
  3. usuń niechciane połączenia

Na przykład:

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

Jak widać, są to połączenia między nazwami zmiennych kodu a tagami xml układu scenorysu;)

opłaconych namrouti
źródło
33

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Moja poprawka była podobna do Gerarda Grundy. Tworząc niestandardową komórkę UITableViewCell przy użyciu XIB, przez pomyłkę zastosowałem nazwę klasy niestandardowej do właściciela pliku zamiast do UITableViewCell. Zastosowanie klasy do UITableViewCell na kanwie i połączenie z nią moich właściwości IBOutlet rozwiązało problem.

popielnik
źródło
Ayyy dag, złap to ... Nie mogę uwierzyć, jak często popełniam ten błąd. Dzięki lol
Benjamin
31
  1. Musisz podać IBOutlettylko raz, IBOutletetykieta, którą twój ivar jest niepotrzebny.
  2. Czy tworzysz instancję swojego NIB za pomocą swojego UIViewController? W pewnym momencie powinieneś zadzwonić[SecondView initWithNibName:@"yourNibName" bundle:nil];
kubi
źródło
To pomogło! Otrzymałem błąd zgodności kodowania klucz-wartość dotyczący właściwości z innego kontrolera widoku. Okazuje się, że dzwoniłem -initWithNibNamez niewłaściwą nazwą stalówki.
jlstrecker
Tak, to pomogło mi również. Używałem UIViewController zamiast MyCustomeViewController .. ale to może być kwestia hierarchii .. introspekcja nie powiodła się z powodu obiektu klasy Miss Miss .. W każdym razie dziękuję
Futur
Miałem podobny problem. Dwa identyczne wpisy IBAction przez przypadek. Nie pokazał się w kodzie, tylko po kliknięciu prawym przyciskiem myszy UIControl (w moim przypadku A UIStepper). Tylko usunięcie jednego naprawiło to.
Dave Hubbard,
30

Działo się tak tylko podczas debugowania na urządzeniu (iPhone). Symulator iOS działał poprawnie. Wydaje się, że wykonanie „Product-> Clean” z Xcode rozwiązało problem, ale nie mam pojęcia, dlaczego.

Maj
źródło
To rozwiązuje mój problem. tsk2x prawie 3 dni bólu głowy.
user3818576,
5
To daje odpowiedź na pytanie. Coś się popsuło w stalówce i robienie porządków rozwiązało to. Przeczytałem i wypróbowałem wszystkie powyższe bezskutecznie, a następnie wykonałem czyszczenie, a po 1 godzinie próbowania naprawy rozwiązanie Maja naprawiło to. Bardzo chciałbym zobaczyć, co w XML mogło to spowodować, ale ruszyłem dalej.
LevinsonTechnologies
To rzeczywiście rozwiązuje problem - wypróbowałem wiele sugestii powyżej i tylko projekt wyczyścił ten błąd, który nagle zaczął się pojawiać. Ugg ...
DustinB
To rozwiązało mój problem, próbowałem wiele powyższych sugestii. Wydaje się dziwne!
Naveen Shan,
23

Miałem dokładnie taki sam komunikat o błędzie i dzięki (!!) dla Kiry z http://www.idev101.com udało mi się rozwiązać wyzwanie. Znalazłem jej stronę dopiero po przejściu przez Google i układaniu wszystkich tych wątków. Teraz piszę tutaj o kolejnym, który przyjdzie do StackOverFlow i ma takie samo wyzwanie, jakie miałem, ponieważ ta osoba najprawdopodobniej trafi do tego wątku przez Google.

Uświadomiłem sobie, że niesłusznie to zrobiłem:

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

Zamiast tego:

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

Gdzie

DeviceViewController

Czy nazwa mojej klasy była również znana jako

DeviceViewController.h 
DeviceViewController.m

Będziesz musiał

"import DeviceViewController.h"

w twojej implementacji (plik .m), do którego chcesz zadzwonić np. inny UIViewController.

Absolutnie nie jest mi przykro, jeśli mówię tylko to, co oczywiste dla początkujących, takich jak ja, i mogę obniżyć liczbę głosów, ponieważ nie jest to dokładnie związane z pytaniem, ale szukałem teraz 4 (?!?) Godzin na odpowiedź na ten komunikat o błędzie . Gdybym mógł oszczędzić to 1 lub 2 osobom, byłoby świetnie :)

PS: Dla osób zainteresowanych dalszym działaniem kodu podczas ładowania drugiego UIViewController:

    [self presentViewController:deviceViewController animated:YES completion:nil];
Yannis
źródło
DZIĘKUJEMY za wszystkie kroki, których używałem Xcode 5 i tak naprawdę nie wiedziałem, jak ręcznie dodać stalówkę, ponieważ domyślnie można dodawać tylko scenorys ... Mam kilka instrukcji, ale nie tak szczegółowych jak twoje. Naprawdę pomogłem !!
Pittfall,
„Niesłusznie to zrobiłem ...” dzięki, to nie pierwszy raz spędzam dużo z powodu tego naprawdę głupiego błędu
tontonCD
23

Może to wynikać z faktu, że kontrolujesz, przeciągnąłeś i utworzyłeś ujście lub akcję i zapomniałeś go usunąć. Nawet jeśli usunąłeś kod, lub nawet jeśli wykonałeś wystarczającą liczbę cmd + Z, musisz przejść do inspektora połączeń swojej serii ujęć i sprawdzić, czy akcja lub ujście, które stworzyłeś, nadal tu jest.

Ilansky Naftali
źródło
Dzięki! Jestem n00b na Xcode i zajęło mi trochę czasu, aby znaleźć nieuczciwe linki. W Xcode 9.2 możesz kliknąć prawym przyciskiem myszy element w widoku scenorysu i zaznaczyć „Odnośniki referencyjne”.
kunigami
21

Patrząc na inne odpowiedzi, wydaje się, że istnieje wiele rzeczy, które mogą powodować ten błąd. Oto jeszcze jeden.

Jeśli ty

  • mieć niestandardowy widok
  • dodano właściwość @IBInspectable
  • a następnie go usunąłem

Wtedy możesz również otrzymać błąd podobny do

Nie można ustawić (xxx) kontrolowanej właściwości zdefiniowanej przez użytkownika w [Twój widok niestandardowy] ...: ta klasa nie jest zgodna z kodowaniem wartości klucza dla klucza [xxx].

Rozwiązaniem jest usunięcie starej właściwości.

wprowadź opis zdjęcia tutaj

Otwórz Inspektora tożsamości dla swojej klasy, wybierz nazwę właściwości w obszarze Zdefiniowane przez użytkownika atrybuty środowiska wykonawczego i naciśnij przycisk minus (-).

Suragch
źródło
Często odwiedzałem tę stronę ... Tym razem to rozwiązanie się udało! Ale choć wydaje się to dziwne, stara właściwość do usunięcia znajdowała się na innym ViewController niż z tej, w której ulega awarii, nie mam pojęcia, dlaczego.
Cinn
15

Dzieje się tak, gdy mój kontroler widoku pierwotnie miał plik .xib, ale teraz jest tworzony programowo.

Mimo że usunąłem plik .xib z tego projektu. Użytkownicy iPhone / iPad mogą zawierać pliki .xib dla tego kontrolera widoku.

Próba załadowania pliku .xib zwykle powoduje awarię:

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

Rozwiązaniem przy programowym tworzeniu może być:

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

Właściwość „Moduł” kontrolera widoku w Inspektorze tożsamości może być inna niż oczekiwano. Upewnij się także, że do Twojej listy docelowej dodano nowe klasy.

ercu
źródło
głosowanie, ponieważ tak było w moim przypadku. Używam Swift i Storyboardów. Kiedy utworzyłem nowy cel kompilacji (aby utworzyć wariant kompilacji), aplikacja nie działała w nowym wariancie, podczas gdy pierwszy działał poprawnie. Aplikacja uległa awarii na kontrolerze widoku, w którym nazwa modułu została w jakiś sposób ustawiona na moduł od pierwszego celu, podczas gdy w działających kontrolerach widoku była bieżąca - <nazwa modułu tutaj> . W takim przypadku musisz usunąć nazwę modułu.
Mixaz,
11

Miałem podobny problem z projektem, który ma dwa cele (z ich własnym MainWindow XIB). Podstawowym problemem, który spowodował ten błąd, było to, że klasa UIViewController nie została uwzględniona na liście zasobów drugiego projektu. Konstruktor interfejsu tj. Pozwolił mi to określić w MainWindow.xib, ale w czasie wykonywania system nie mógł zlokalizować klasy.

Tj. Kliknij cmd na odpowiedniej klasie UIViewController i sprawdź dwukrotnie, czy jest ona zawarta w zakładce „Cele”.

David Carney
źródło
9

Żeby dodać do tego, bo również otrzymywałem ten błąd. Przeglądając wszystkie te odpowiedzi, większość wydaje się dotyczyć pracy z interfejsem użytkownika i elementami scenorysu. Wiem, że oryginalny plakat wydawał się działać z interfejsem użytkownika, ale podczas wyszukiwania możliwych przyczyn tego błędu przeważnie wszystkie pytania prowadzą do tego pytania, a inne są zamknięte jako duplikaty lub po prostu mają problemy z łączeniem rzeczy w scenariuszu, więc zrobię to dodaj moje rozwiązanie.

Pracowałem nad kodowaniem usługi internetowej w Swift 2. Zbudowałem wszystkie potrzebne obiekty proxy i kody pośredniczące. Gdy przeglądałem zwrócony XML, dynamicznie tworzyłem instancję moich obiektów, z których wszystkie pochodziły NSObjecti których setValue:forKeyużywałem. Za każdym razem, gdy setValue:forKeypróbowano ustawić właściwość, wybuchał ten błąd.

Miałem instrukcji switch dla każdego typu miałem do czynienia z (na przykład Bool?, CShort?, String?) i dla każdego węzła XML ja przeszedłem i sprawdziła, jaki typ był na obiekcie, a następnie konwertowane do wartości tego typu i próbował ustawić go setValue:forKey.

W końcu zacząłem komentować wszystkie te setValue:forKeywiersze i stwierdziłem, że mój defaultprzypadek instrukcji switch działa String?.

W końcu doszedłem do wniosku, że nie można używać opcjonalnych szybkich typów, setValue:forKeychyba że mają bezpośrednie mapowanie na typ Objective-C, taki jak String?lub NSNumber?. Skończyło się na zmianie wszystkich CShort?typów na, NSNumber?ponieważ ma to bezpośrednie mapowanie. W Bool?moim przypadku było dla mnie w porządku po prostu użyć Booli zainicjować false. Inni mogą nie mieć tego luksusu.

W każdym razie, jaki ból głowy był tak miejmy nadzieję, pomaga to komuś, kto ma podobny problem i ciągle zostaje przekierowany na to pytanie i mówi do siebie: „Nie robię nic w interfejsie użytkownika !!”.

Wreszcie, aby powtórzyć jeszcze raz, kodowanie klucz-wartość nie działa z opcjami. Poniżej znalazłem gdzieś, ale zapominam, gdzie to napisałem, przepraszam i dziękuję, jeśli pamiętam, gdzie to znalazłem, ale uratowało mi to życie:

Nie można używać KVC we właściwości Optional Int, ponieważ KVC to Cocoa / Objective-C, a Objective-C nie widzi Optional Int - nie jest połączony z Objective-C. Cel C widzi tylko typy, które są połączone z celem C:

typy klas pochodzące z NSObject

typy klas, które są widoczne w @objc

Szybkie struktury, które są zmostkowane

AtheistP3ace
źródło
1
Jeśli próbujesz połączyć wartość Swift bool za pomocą powiązań Cocoa, musisz udostępnić ją za pomocą dyrektywy @objc; w przeciwnym razie rzeczywiście pojawia się ten błąd. To powinna być najlepsza odpowiedź.
jvarela
9

„ta klasa nie jest zgodna z kodowaniem wartości klucza dla klucza” Wiem, że jest trochę za późno, ale moja odpowiedź jest inna, więc myślę, że należy ją opublikować, popychałem drugi kontroler w niewłaściwy sposób, oto próbka

Niewłaściwy sposób na wciśnięcie kontrolera

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

Właściwa droga

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

Nie znalazłem żadnej odpowiedzi takiej jak powyżej, więc może to pomóc komuś, kto ma ten sam problem

Muhammad Ammad
źródło
8

Może tak być w przypadku odwołania do komponentu interfejsu Xib, którego nazwę zmieniono lub usunięto. Ponowne odniesienie działa dla mnie.

MehrozKarim
źródło
8

Właśnie miałem ten problem w moim zduplikowanym projekcie i rozwiązałem go, sprawdzając 2 miejsca:

1- Upewnij się, że masz plik .m na liście -> Projekt - Fazy kompilacji - Kompiluj źródła
2- Następnie przejdź do konstruktora interfejsów (prawdopodobnie jest to błąd występuje tylko z IB) i odłącz wszystkie właściwości, etykiety, obrazy itd. ... Następnie ponownie połącz wszystkie. Zdałem sobie sprawę, że usunąłem atrybut, ale nadal był on powiązany w IB.

Mam nadzieję, że to działa dla niektórych.

kubilay
źródło
7

Innym problemem „niezgodnym”, który znalazłem, było to, że z jakiegoś powodu udało mi się mieć dwie kopie klasy.

Dodawałem klucze do niewłaściwej kopii. Konstruktor interfejsów wciąż widział klucze i pozwalał mi się do nich podłączyć, ale w czasie wykonywania korzystał z innej kopii klasy, która nie miała nowych kluczy.

Aby znaleźć, która była „właściwą” kopią, użyłem XCode-a, klikając nazwę klasy w innym miejscu, aby przejść do właściwej kopii, a następnie zabiłem złe, nieużywane kopie (po przeniesieniu najpierw moich edycji z nieużywanej kopii).

Morał tej historii: duplikaty plików klas są złe.

Jason
źródło
7

Ten błąd to coś innego!

Oto jak to naprawiłem. Używam xcode w wersji 6.1.1 i używam szybkiego. Ten błąd pojawia się za każdym razem, gdy moja aplikacja próbuje wykonać segue, aby przejść do następnego ekranu. Oto co zrobiłem.

  1. Sprawdzono, czy przycisk został podłączony do właściwej akcji (to nie był problem, ale nadal dobrze to sprawdzić)
  2. Sprawdź, czy przycisk nie zawiera żadnych dodatkowych działań ani gniazd, które mogły zostać utworzone przez pomyłkę. (To nie był problem, ale nadal warto to sprawdzić)
  3. Sprawdź dzienniki i upewnij się, że wszystkie przyciski na NASTĘPNYM EKRANIE mają prawidłowe działania, a jeśli są jakieś sekwensy, upewnij się, że mają unikalny identyfikator. (To był problem)
    • Jedna z nich nie miała unikalnego identyfikatora
    • Jeden z przycisków miał akcję i dwa wyloty, które utworzyłem przez pomyłkę.
    • Usuń wszelkie dodatkowe wyloty i upewnij się, że segues do następnego ekranu mają unikalne identyfikatory.

Twoje zdrowie,

Ronaldoh1
źródło
6

Miałem ten sam objaw. Główną przyczyną było to, że „Docelowe członkostwo” dla mojego pliku źródłowego nie było ustawione na poprawny cel. Zakładam, że to oznacza, że ​​moja klasa nie zostałaby zbudowana i uwzględniona w mojej aplikacji.

Aby to poprawić:

  1. Zaznacz plik .m.
  2. W prawym okienku wybierz Inspektora plików.
  3. W sekcji „Docelowe członkostwo” upewnij się, że odpowiedni cel kompilacji jest zaznaczony.

Mam nadzieję, że to pomoże komuś tam.

Mike M. Lin
źródło
6

Jeśli masz niestandardową podklasę UIViewController z IBOutletami, które powodują problemy, jedynym zestawem kroków, które naprawdę pozbyłem się błędu, były

.1 Zmień klasę na UIViewController

.2 Odłącz wszystkie gniazda (wszystkie będą teraz miały żółty trójkąt ostrzegawczy) - może wystarczyć jedynie odłączenie problematycznych gniazd.

.3 Wykonaj wszystkie standardowe kroki - ↑ ⌘K, usuń dane pochodne (, maty modlitewne, koraliki zmartwienia)

.4 Uruchom aplikację - przejdź do problematycznej sceny.

.5 Zabij aplikację, wróć do Konstruktora interfejsów zmień klasę z powrotem na niestandardową nazwę klasy.

.6 Podłącz ponownie gniazdka.

Uruchom aplikację, a to zwykle rozwiąże problemy dotyczące zgodności klucz-wartość.

Damo
źródło
Działa to podczas kopiowania i wklejania sceny w edytorze scenariuszy.
Mizmor,
5

W moim przypadku. Po scaleniu nie miałem brakujących gniazd w plikach xib.

Shift + Command + K.

rozwiązał mój problem. Oczyściłem swój projekt i odbudowałem.

użytkownik123456
źródło
4

W moim przypadku było to spowodowane odwołaniem się do niewłaściwej stalówki:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
wspruijt
źródło
1
Zdarza mi się, gdy zmieniam nazwę klasy kontrolera widoku i zapominam, że nazwa stalówki również musi się zmienić. Ponieważ nazwa końcówki jest tylko ciągiem, nie ma błędu kompilatora.
kris,
3

Ten błąd pojawiał się w przypadku scenariuszy. Powyższe rozwiązanie nie wydawało się problemem, więc skończyłem z usunięciem kontrolera widoku i dodaniem go ponownie (i oczywiście ponownym podłączeniem segue i ponownym przypisaniem klasy), co go naprawiło. Nie wiem, co to tak naprawdę było, ale zmieniłem nazwę powiązanej klasy kontrolera widoku na krótko przed tym, zanim to się zaczęło, więc może to coś ukryło.

Symetryczny
źródło
Znowu dostałem ten błąd. Tym razem stworzyłem nowy kontroler widoku pustej tabeli z przypisaną moją klasą, pozostawiając niedziałający w spokoju i przeniosłem do niego segue. To zadziałało. Następnie powoli skopiowałem każdy element w widoku, aż znów się nie powiódł. Tym razem problem okazał się taki, że przypisałem niektóre „Zdefiniowane przez użytkownika atrybuty środowiska wykonawczego” dla selektora (myślałem, że mogę ich użyć do zainicjowania selektora, więc nie musiałbym tego robić w kodzie, nie mam pojęcia, czy to możliwe ). Usunięcie tego rozwiązało problem. Ten błąd jest naprawdę okropny, mam nadzieję, że został poprawiony w przyszłej wersji!
Symetryczny
3

Mam ten sam problem. Zresetowałem symulator. Usuwanie i dodawanie kontrolki przycisku. i wreszcie zrobiłem czyste. :) Dzięki przepełnieniu stosu. Trochę, jak mój kod działa poprawnie i zaczyna działać.

priya
źródło