Błąd Xcode 6: nieznana klasa w pliku Interface Builder

600

Uaktualniłem do Xcode 6 beta 4, a teraz moja aplikacja ciągle zawiesza się z komunikatem

Nieznana klasa X w pliku konstruktora interfejsów.

Zawiesza się, ponieważ podobno Xcode nie może znaleźć moich niestandardowych klas, które połączyłem w mojej Storyboard, ale pokazuje, że są one poprawnie połączone w interfejsie Xcode.

Jestem pewien, że wszystko jest poprawnie połączone. Moją jedyną opcją może być usunięcie całego pliku scenorysu i rozpoczęcie od zera, ponieważ może on być w jakiś sposób uszkodzony.

Edycja: Chciałbym również dodać, że próbowałem wyczyścić, zresetować symulator, zadzierać z fazami kompilacji itp. Nic z tego nie działa.

Epicki bajt
źródło
Możliwy duplikat stackoverflow.com/questions/3416269/...
Bouke
1
@ ImreKelényi Masz rację. Zdarzyło mi się to ostatnio po zrobieniu tego, co właśnie opisałeś.
Epic Byte
To zadziałało dla mnie, stackoverflow.com/questions/1725881/...
vrunoa
To była dla mnie literówka, debuguj ją w elemencie Control, aż do jej pojawienia się wybierz; Zobacz Kontroler> inspektor tożsamości> Klasa niestandardowa> Klasa. usuń to, jeśli ta klasa nie jest zdefiniowana.
Mavericks
9
PROSZĘ ZANOTOWAĆ! Ten „błąd” może wynikać z różnych źródeł. Jeśli zaakceptowana odpowiedź nie działa, przejdź w dół i wypróbuj następną odpowiedź. Prawidłowa odpowiedź dla mojej sytuacji była 5. odpowiedzią.
Jacksonkr,

Odpowiedzi:

1454

Rozwiązałem ten problem podczas pisania pytania. Pomyślałem, że odpowiem na moje pytanie i zostawię to tutaj wszystkim, którzy mogą napotkać ten problem podczas korzystania z Xcode 6 beta 4.

Aby rozwiązać ten problem, musisz wybrać każdy ze swoich niestandardowych obiektów klasy w Storyboard (obejmuje to wszelkie niestandardowe widoki, nawet same niestandardowe kontrolery widoków).

Następnie po zaznaczeniu tych obiektów otwórz inspektora tożsamości i pod „Klasą niestandardową” powinieneś zobaczyć opcję Moduł. Kliknij wewnątrz pola tekstowego Moduł i naciśnij klawisz Enter.

Otóż ​​to! Bieżący moduł dla wszystkich moich obiektów niestandardowych musiał być wewnętrznie niepoprawnie ustawiony w Xcode 6 beta 4. Ale inspektor nie miał na to żadnych wizualnych wskazań.

Zauważ, że jeśli naciśnięcie Enter w polu tekstowym Moduł nie działa, spróbuj wybrać strzałkę po prawej stronie i ręcznie wybierz bieżący moduł, a następnie wyczyść pole tekstowe i naciśnij Enter. Możesz także spróbować nacisnąć klawisz Enter w polu tekstowym klasy (chociaż zwykle ma to na celu rozwiązanie innego problemu).

Oto obraz, aby wyjaśnić: wprowadź opis zdjęcia tutaj

Epicki bajt
źródło
70
Dla mnie kliknięcie wewnątrz „Modułu” i naciśnięcie Enter nie działało konsekwentnie, ale wybranie pola „Klasa” (i naciśnięcie Enter) zawsze działało.
Imre Kelényi
2
Dla mnie cel został ustawiony poprawnie, ale klasa nadal nie pojawiała się w IB. Zauważyłem jednak, że „Lokalizacja” pliku pokazuje ścieżkę „Względem projektu” zamiast „Względem grupy”. Usunięcie odwołania do pliku ORAZ grupy i ponowne dodanie go w katalogu głównym projektu działało dla mnie.
knl
8
Łał. Dzięki za to, nie sądzę, że inaczej bym tam dotarł. Naprawiono problem, który zaczął się pojawiać po dodaniu @objc(...)do jednej z moich klas Swift.
ndbroadbent
12
Ten problem jest nadal obecny w XCode 7.2. To rozwiązanie działało.
Tom Fast,
3
To wciąż problem w Xcode 8.3.1 ... taka szkoda
Sepehr Behroozi
99

Czasami brakowało Xcode customModule="AppName" customModuleProvider="target"

Aby to naprawić, otwórz scenorys jako kod źródłowy i zastąp ten wiersz:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">

do tego:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
 customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
ChikabuZ
źródło
7
Właściwie w moim przypadku musiałem usunąć customModuleProvider, a następnie błąd zniknął.
Maciej Swic 11.03.15
3
Guillermo, wciąż dzieje się w Xcode od końca marca!
Ed Manners
3
@MaciejSwic Usunięcie customModuleProviderzrobiłem to również dla mnie, dziękuję!
Sakiboy,
1
co z plikami Xib?
SleepsOnNewspapers
7
Wciąż się dzieje ... to takie rzeczy sprawiają, że chcę płakać :(
Luke
72

Miałem ten problem po zmianie nazwy szybkiej klasy. Rozwiązano to za pomocą dyrektywy @objc:

@objc(ForumTopicListViewController) class ForumTopicListViewController
użytkownik1760527
źródło
4
To naprawiło to dla mnie, miałem @objc class Xi zmieniłem się do @objc(X) class Xpracy.
Joe
1
Możesz także spróbować usunąć swoje pochodne dane, patrz stackoverflow.com/questions/24039932/…
user1760527,
Wystąpił ten problem po zmianie nazwy domyślnej klasy ViewController z szablonu projektu Single View. Zastanawiam się, jaką magię zastosowano, aby @objc()dyrektywa nie była potrzebna dla „oryginalnej” klasy ViewController ...
Berend Klein Haneveld,
Idę na drugą stronę. Podałem nazwę modułu w pliku Storyboard, ale dodałem także dyrektywę @objc.
WeZZard,
1
NIE działało dla mnie. :( Nie działa też rozwiązanie nazwy modułu.
mythicalcoder
64

Projektuj z wieloma celami

W moim przypadku pracuję nad Projektem z wieloma Celami, a problem polegał na tym, że „dziedziczenie z Celu” nie zostało zaznaczone. Wybranie opcji „dziedzicz od celu” rozwiązało mój problem

wprowadź opis zdjęcia tutaj

Muhammad Nayab
źródło
Dzięki za opublikowanie tego. Rozwiązałem problem, który widziałem bardzo szybko.
JaredH
Miałem podobną sytuację. (XCode 9.4.1) Stworzyłem aplikację iOS o nazwie FilesTestA, z niestandardowym UIView o nazwie MxFileView (która składała się z MxFileView.swift i MxFileView.xib). Następnie dodałem kolejny cel: widżet Dzisiaj („FilesTestAWidget”). Rozwiązanie dotyczące używania MxFileView w widżecie: (1) class = "MxFileView"; (2) zaznacz „Dziedzicz moduł od celu” (lub odznacz go i ręcznie wpisz „FilesTestAWidget”); (3) w celu aplikacji, upewnij się, że zarówno MxFileView.swift, jak i MxFileView.xib zawierają FilesTestAWidget w docelowym członkostwie.
Kenster999,
Zdarzyło mi się to w nowym projekcie z domyślnego szablonu w Xcode 10.1 (pojedynczy cel aplikacji na iOS i 2 cele testowe). Pole wyboru zostało odznaczone dla wszystkich moich niestandardowych kontrolerów widoku (więc tekst zastępczy brzmiał „Brak”). Po przejrzeniu i zaznaczeniu pola wyboru dla każdego niestandardowego kontrolera widoku w mojej serii ujęć problem został rozwiązany.
Mason
58

To działało dla mnie ..

Sprawdź skompilowane źródło, czy ten plik (np. ViewController.m) został dodany, czy nie, w moim przypadku plik ViewController nie został dodany, więc dawał mi błąd.

wprowadź opis zdjęcia tutaj

mavericks
źródło
@CarmenA Zawsze dodajesz tylko pliki „.m” Compile Sources. To naprawdę jest poprawne (i tylko) rozwiązanie dla niektórych.
Jacksonkr,
Wypróbowałem kilka innych rozwiązań bez powodzenia. To załatwiło sprawę. Z jakiegoś dziwnego powodu w jednym celu brakowało jednego pliku źródłowego, który dawał mi pasowania.
galactikuh
dla mnie też. Zdarzyło się, że niektórzy dostali rozwiązanie konfliktu
Eldhose
46

Może się to zdarzyć w dowolnym Xcode powyżej 6.0. Zdarzyło mi się to po zmianie nazwy niektórych klas ViewController w projekcie Swift (ale myślę, że stanie się tak również z Obj-C). Musisz tylko otworzyć konstruktora interfejsu, przejść do Inspektora tożsamości ViewController, którego nazwa została zmieniona, wybierz klasę i naciśnij Enter. Spowoduje to przypisanie zmienionej nazwy klasy do wybranego ViewController, a także zresetuje wartość modułu, która zostanie utracona po zmianie nazwy klasy.

Aktualizacja Xcode 8.1 (prawdopodobnie także 8.0):

Xcode 8.1 po prostu ulega awarii. Po prostu i irytująco po prostu ulega awarii i nic nie drukuje. Godziłem się za tą widmową katastrofą przez godzinę, aby dowiedzieć się, że to była ta sama rzecz - nieprzypisana klasa w IB. Jeśli występują awarie fantomowe, najpierw sprawdź IB pod kątem nieprzypisanych klas.

jovanjovanovic
źródło
dzięki za to. wygląda na to, że zgodnie z twoją sugestią Xcode zaktualizuje moduł (pod klasą w IB) z None na Current. Myślę, że problem polega na tym, że samo wprowadzenie nazwy bez wciśnięcia klawisza Enter nie powoduje aktualizacji modułu przez Xcode.
rockiesGrizzly
To zadziałało dla mnie. Nieumyślnie zmieniłem nazwę klasy kontrolera, więc oczywiście nie istniała już po załadowaniu kontrolera widoku.
Litehouse
32

Czasami kontroler, który udostępniasz, traci członkostwo docelowe z bieżącej aplikacji. W takim przypadku naciśnięcie klawisza Enter w polu „Moduł” nic nie da. Przejdź do kontrolera i upewnij się, że docelowa liczba członków jest ustawiona na bieżącą aplikację.

Furqan Khan
źródło
To był również problem dla mnie - wiele celów prowadzi do przypadkowego włączenia pliku klasy do celu, który budowałem.
Ryan Kreager
Połączyłem pliki i brakuje mi tego w jednym z moich celów, świetna odpowiedź
Benjamin Jimenez
Dobrze, połączenie pbx złamało docelowe wartości członkostwa.
system
32

Włączenie Inherit Module From Targetzajęło właściwy moduł docelowy. To rozwiązało problem.

wprowadź opis zdjęcia tutaj

Arnab
źródło
Potwierdzać. Pomogło mi to rozwiązać problem.
Chris8447
Zwykle mam ten problem podczas konwersji kontrolera widoku z Objective-C na Swift. Ponownie wpisuję ostatnią literę i naciśnij Enter. Powinien także załatwić sprawę.
DevNebulae
30

Moja odpowiedź: ustaw niestandardowy moduł na niestandardową nazwę kapsuły (w moim przykładzie - niestandardowa nazwa klasy) jak na załączonym zrzucie ekranu

To rozwiązanie dotyczy konkretnego przypadku : niestandardowych klas widoków ze środowiska Pod (lub Kartaginy ).

Infrastruktura: XCode8, Swift3

wprowadź opis zdjęcia tutaj

Tamara
źródło
18

Naprawiłem to, robiąc dokładnie odwrotność tego, co sugerował ChikabuZ (choć dziękuję za wskazanie tego). W pliku scenorysu znajdź to:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">

i zastąp to:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" sceneMemberID="viewController">

Nie mogę uwierzyć, ile godzin tracę na omijanie błędów w kompilatorze Swift i Xcode 6

Orlin Georgiew
źródło
17

Wybór właściwego Module dla mojegoCustom Class rozwiązałem ten problem.

Oto on:

wprowadź opis zdjęcia tutaj

Roy
źródło
13

Napotkałem ten problem w Xcode 8 , aby go rozwiązać, musiałem zmodyfikować scenorys w edytorze tekstu.

Zasadniczo poszukaj kontroli i usuń customModuleicustomModuleProvider z jednostki sterującej.

Zrobił dla mnie lewę.

George Maisuradze
źródło
Hah! Fajny hack :)
Vexy
10

Miałem ten sam problem.

W moim przypadku Xcode nie dodał mojej klasy niestandardowej do: Cel> Faza kompilacji> Kompiluj źródła.

Dlatego polecam sprawdzenie, czy jest tam Twoja nazwa CustomClass.m.

wprowadź opis zdjęcia tutaj

Mam nadzieję, że to Ci pomoże.

rcmstark
źródło
Tak się stało i na szczęście znalazłem wyjście! Przyszedłem tutaj, by odpowiedzieć, ale ty byłeś pierwszy. Dzięki!!!
Gabriel Piffaretti
9

Napotkałem ten problem w Xcode 6.1 po usunięciu Main.storyboard, LaunchScreen.xibpliku i domyślnymViewController klas z mojego projektu.

Naprawiłem to, usuwając wpisy Launch Screen Filei Main InterfacezInfo.plist

Vinay Jain
źródło
9

Sprawdź, czy Twoja klasa ma odpowiednie docelowe członkostwo .

Jakub Truhlář
źródło
8

Wszędzie szukałem tego w Google. Żadna z odpowiedzi nie działa dla mnie, dopóki nie poznałam 1 kolesia, który poprosił mnie o przeniesienie folderu projektu na pulpit. Po prostu działało automatycznie. Najwyraźniej jeśli masz projekt do folderu głęboko w wielu folderach, XCODE faktycznie się psuje.

VBaarathi
źródło
Znalazłem ten problem w Xcode 7 beta 5, odkąd miałem go wcześniej w Xcode 6. Tym razem ta metoda działa dla mnie.
Jake Lin,
1
W studiu wizualnym jest podobny problem. Ale tam pojawia się wyraźne ostrzeżenie, że ścieżka jest za długa i nie można dodawać ani edytować rzeczy. Nie jestem pewien, czy to samo z XCODE, ale po tym odcinku trzymam wszystkie moje projekty w dokumentach lub na komputerze i nigdy więcej nie miałem tego problemu. Dałem nawet tę radę komuś, kto korzysta z Xamarin Studio, i ona również zadziałała dla nich ...
VBaarathi,
7

Te kroki działają dla mnie.

1) Wyczyść dane pochodne.
2) Usuń pliki .h i .m
3) Ponownie utwórz pliki .h i .m

ARWIN
źródło
To również działało dla mnie. Nawet sprawiłem, że działało bez usuwania danych pochodnych.
jaytrixz
To zadziałało dla mnie, bardzo dziękuję Arwin, ale wciąż nie rozumiem, dlaczego powoduje to taki błąd, ponieważ wcześniej nie modyfikowałem niczego w klasie ani w IB
Kirtikumar A.
7

Rozwiązałem ten problem, otwierając plik scenorysu jako kod źródłowy i używając Command-F do wyszukiwania mojej nieznanej klasy i usuwania niestandardowej klasy z nią powiązanej.

Wraithseeker
źródło
6

To, co powiedział @gfrs, jest poprawne, musisz ustawić moduł. Jednak raz natknąłem się na problem, którego moja klasa nie była wymieniona wClass rozwijanej. W końcu usunąłem szybki plik, ponownie uruchomiłem Xcode i ponownie utworzyłem plik. Wreszcie klasa została wymieniona na liście i mogła być używana w Storyboard.

Zobacz także tę odpowiedź , która wygląda jak rozwiązanie „prawdziwego” problemu, na jaki się natknąłem.

Bouke
źródło
Usuwanie i ponowne dodawanie pliku klasy działało dla mnie. Dzięki!
Nicolas Miari
6

Rozwiązałem ten problem, wpisując nazwę modułu (niestety lista rozwijana nic nie pokaże ...) w klasie niestandardowej inspektora tożsamości dla wszystkich kontrolerów widoków i widoków.

Konieczne może być również wskazanie docelowego dostawcy. Aby osiągnąć ten cel, możesz otworzyć scenorys w trybie kodu źródłowego i dodać atrybut „customModuleProvider” zarówno w ViewController, jak i nawiasach kątowych View.

Teng Long
źródło
6

Moje rozwiązanie (Xcode 8.1 Swift 3.0):

Nieznana klasa xxx w pliku konstruktora interfejsów.

Otwórz StoryBoard jako kod źródłowy i wyszukaj xxx . Usuń atrybut zawierający wartość xxx . Kompiluj i uruchamiaj.

ibrahimyilmaz
źródło
WTF? To było dla mnie absolutnie konieczne, dziękuję. Musiałem usunąćcustomModule="" customModuleProvider=""
Dan Rosenstark
1
Jeśli spróbujemy opublikować aplikację w sklepie z aplikacjami zawierającą taki błąd, aplikacja zostanie odrzucona bez namysłu.
ibrahimyilmaz
Nie zgadzam się. Właśnie przesłałem kompilację, którą musiałem zmodyfikować w ten sposób do TestFlight i jest ona gotowa do testów beta ... zobaczymy, co się stanie w rzeczywistym sklepie z aplikacjami, ale to IMO z błędem IB. Dzięki!
Dan Rosenstark,
4

W moim przypadku dodałem flagę -ObjCdo Other Linker Flagsustawień projektu, aby działała. Próbowałem też z -all_loadflagą i to też dobrze działało.

wprowadź opis zdjęcia tutaj

Rostyslav Druzhchenko
źródło
3

W moim przypadku klasa wymieniona w Storyboard / xib nie miała ustawionego docelowego członkostwa .

Aby to naprawić, nadaj tej klasie .hi .mplikom takie samo docelowe członkostwo, jak inne klasy.

Nie ustawiono docelowego członkostwa.

pkamb
źródło
To był mój problem, ale próbując różnych rozwiązań, spowodowałem problem, który rozwiązuje odpowiedź Epic Byte. Musisz mieć kod źródłowy w budowanym celu, ale również w IB musisz ustawić kontroler widoku, aby był częścią bieżącego celu.
SafeFastExpressive
Docelowe członkostwo było również moim problemem, rozglądałem się wszędzie, ale dzięki tej odpowiedzi mogłem go rozwiązać.
Borzh
3

Moim rozwiązaniem było usunięcie @objc z definicji klasy niestandardowej.

DenisKirillov
źródło
2
Przykład z wyjaśnieniem byłby świetny.
Nilambar Sharma
2

Napotkałem problem, kiedy przeniosłem storyboard z projektu Swift do projektu Cel-c, zauważając odpowiedź vvkuznetsova , okazało się, że dwa projekty wykorzystują ten sam identyfikator. I „Produkt -> Wyczyść” i naciśnij Enter w polu tekstowym Moduł i Klasa. problem zniknął.

xhg
źródło
2

Naprawiłem to zgodnie z sugestią Laury, ale nie musiałem ponownie tworzyć plików.

Za pomocą XCode 4 w Nawigatorze projektu wybierz plik .m zawierający klasę, na którą skarży się

Idź do Widok-> Narzędzia-> Pokaż inspektora plików (pokaże to Inspektora plików po prawej stronie z tymi informacjami o pliku m)

Otwórz sekcję Docelowe członkostwo i upewnij się, że dla tego pliku .m wybrano cel

Kiedy dodałem mój plik .m do mojego projektu, z jakiegoś powodu nie dodałem go do mojego domyślnego celu, co spowodowało, że otrzymałem wspomniany błąd.

Jignesh Kalantri
źródło
2

Moim problemem był błąd użytkownika. Miałem ogólny UIView w mojej serii ujęć, a w sekcji Klasa niestandardowa Inspektora tożsamości przypadkowo zmieniłem nazwę z UIView na bełkot.

Wystarczyło zmienić go z powrotem na UIView.

Skuter
źródło
Zrobiłem to samo, ale przypadkowo dodałem nazwę niestandardowych kontrolerów widoku do sekcji klasy niestandardowej widoku głównego kontrolera ViewControllers. Chciałem więc zobaczyć, dlaczego nie można było znaleźć kontrolera widoku, gdy cały czas był to widok root.
TMw
1

To, co zadziałało tylko dla mnie, to dodanie nazwy modułu do pliku xib ...

Tak, pliki Xib wyglądają tak:

mymodule.MyViewController.xib (Module being the name of the proyect, usually)

HORRIBLE, moim zdaniem, rozwiązanie, ale podobno właśnie tak chce nas Apple.

To pytanie pokazuje 3 możliwe obejścia w wersji beta 4 ... najwyraźniej według niektórych Apple nie było bardzo pomocne w tej sytuacji, ponieważ nazywają to „działaniem zgodnie z przeznaczeniem”.

SH
źródło
1

Miałem ten sam problem z Xcode w wersji 6.1 (6A1052d). Myślę, że problem pojawia się, jeśli zmienisz nazwę swojego projektu App / Xcode.

Moim rozwiązaniem było ręczne dodanie nazwy modułu w kreatorze interfejsów.

patrickS
źródło
1

Miałem ten problem po dodaniu nowego celu, a następnie utworzeniu nowej klasy za pomocą okna dialogowego „Nowy plik”, ale przypadkowo nie sprawdziłem nowego celu, a także oryginalnego celu w oknie dialogowym tworzenia, więc obiekt został dodany tylko do mojego oryginalny cel. Rozwiązaniem było usunięcie plików źródłowych (tylko usunięcie odniesienia), a następnie dodanie ich z powrotem za pomocą „Dodaj pliki”, tym razem sprawdzając oba cele.

JulianSymes
źródło