Próbuję połączyć UILabel
z IBOutlet
utworzonym 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.”
ios
macos
cocoa
cocoa-touch
interface-builder
Guillaume Dubois
źródło
źródło
Odpowiedzi:
Twój kontroler widoku może mieć niewłaściwą klasę w xib.
Pobrałem twój projekt.
Występuje błąd
Jest to spowodowane tym, że
Second
kontroler widokuMainWindow.xib
ma klasęUIViewController
zamiastSecondView
. 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
.h
pliku.Usuń go w Inspektorze połączeń
.xib
lub.storyboard
pliku.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 (zfoo.storyboard
) pozostały następujące elementy :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źródło
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:
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ć.
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):
Zobaczysz, że ten przycisk ma więcej niż jedno przypisanie / przypisanie. Usuń jedno z szarych okien „głównego ...” za pomocą małego „x”:
źródło
Musiałem usunąć aplikację z symulatora / iPhone'a, aby pozbyć się tego błędu.
źródło
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.
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ń.
źródło
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.
źródło
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ę.
źródło
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.
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”.
źródło
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.
źródło
w moim przypadku był to błąd w kodzie źródłowym scenorysu, wykonaj następujące kroki:
<connections>
Na przykład:
Jak widać, są to połączenia między nazwami zmiennych kodu a tagami xml układu scenorysu;)
źródło
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.
źródło
IBOutlet
tylko raz,IBOutlet
etykieta, którą twój ivar jest niepotrzebny.UIViewController
? W pewnym momencie powinieneś zadzwonić[SecondView initWithNibName:@"yourNibName" bundle:nil];
źródło
-initWithNibName
z niewłaściwą nazwą stalówki.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.
źródło
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:
Zamiast tego:
Gdzie
Czy nazwa mojej klasy była również znana jako
Będziesz musiał
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:
źródło
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.
źródło
Patrząc na inne odpowiedzi, wydaje się, że istnieje wiele rzeczy, które mogą powodować ten błąd. Oto jeszcze jeden.
Jeśli ty
Wtedy możesz również otrzymać błąd podobny do
Rozwiązaniem jest usunięcie starej właściwości.
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 (-).
źródło
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ę:
Rozwiązaniem przy programowym tworzeniu może być:
źródło
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.
źródło
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”.
źródło
Ż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
NSObject
i którychsetValue:forKey
używałem. Za każdym razem, gdysetValue:forKey
pró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ć gosetValue:forKey
.W końcu zacząłem komentować wszystkie te
setValue:forKey
wiersze i stwierdziłem, że mójdefault
przypadek instrukcji switch działaString?
.W końcu doszedłem do wniosku, że nie można używać opcjonalnych szybkich typów,
setValue:forKey
chyba że mają bezpośrednie mapowanie na typ Objective-C, taki jakString?
lubNSNumber?
. Skończyło się na zmianie wszystkichCShort?
typów na,NSNumber?
ponieważ ma to bezpośrednie mapowanie. WBool?
moim przypadku było dla mnie w porządku po prostu użyćBool
i 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:
źródło
„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
Właściwa droga
Nie znalazłem żadnej odpowiedzi takiej jak powyżej, więc może to pomóc komuś, kto ma ten sam problem
źródło
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.
źródło
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.
źródło
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.
źródło
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.
Twoje zdrowie,
źródło
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ć:
Mam nadzieję, że to pomoże komuś tam.
źródło
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ść.
źródło
W moim przypadku. Po scaleniu nie miałem brakujących gniazd w plikach xib.
rozwiązał mój problem. Oczyściłem swój projekt i odbudowałem.
źródło
W moim przypadku było to spowodowane odwołaniem się do niewłaściwej stalówki:
źródło
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.
źródło
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ć.
źródło