Błąd „Unknown class <MyClass> w pliku Interface Builder” w czasie wykonywania


260

Mimo że Konstruktor interfejsów jest świadomy MyClass, podczas uruchamiania aplikacji pojawia się błąd.

Dzieje się tak, gdy MyClassjest częścią biblioteki i nie dzieje się tak, jeśli skompiluję klasę bezpośrednio w miejscu docelowym aplikacji.


Jak łączysz się z biblioteką?
Elise van Looij

Używam zależnego podprojektu i przeciągnąłem kroplę z produktów podprojektu Xcode do fazy kompilacji mojego obecnego celu „Link Binary With Library”.
jhoule,

Jeśli klasa pochodzi z CocoaPods, może to pomóc github.com/CocoaPods/CocoaPods/issues/491 .
Protokół

Odpowiedzi:


222

Pomimo błędu „ Unknown class MyClass in Interface Builder file. Drukowanego w czasie wykonywania, ten problem nie ma nic wspólnego z Interface Builder, ale raczej z linkerem, który nie łączy klasy, ponieważ żaden kod nie używa go bezpośrednio.

Gdy dane .nib (skompilowane z .xib) są ładowane w czasie wykonywania, MyClassodwołuje się do nich za pomocą łańcucha, ale linker nie analizuje funkcji kodu, po prostu istnienie kodu, więc nie wie o tym. Ponieważ żadne inne pliki źródłowe nie odwołują się do tej klasy, linker optymalizuje ją, by nie istniał podczas tworzenia pliku wykonywalnego. Kiedy więc kod Apple próbuje załadować taką klasę, nie może znaleźć kodu z nią powiązanego i wyświetla ostrzeżenie.

Domyślnie cele Objective-C będą miały -all_load -ObjCustawione domyślnie flagi, które zatrzymają wszystkie symbole. Ale zacząłem od celu C ++ i nie miałem tego. Niemniej jednak znalazłem sposób na obejście tego, dzięki czemu linker jest agresywny.

Hack, którego pierwotnie użyłem, polegał na dodaniu pustej procedury statycznej, takiej jak:

+(void)_keepAtLinkTime;

co nic nie robi, ale zadzwoniłbym raz, na przykład:

int main( int argc, char** argv )
{
   [MyClass _keepAtLinkTime];
   // Your code.
}

Zmusiłoby to linker do zachowania całej klasy, a błąd zniknie.

Jak zauważył jlstrecker w komentarzach, tak naprawdę nie musimy dodawać _keepAtLinkTimemetody. Wystarczy zadzwonić do istniejącego, takiego jak:

   [MyClass class];

wykonuje lewę (o ile wywodzisz się z an NSObject).

Oczywiście możesz to nazwać w dowolnym miejscu swojego kodu. Myślę, że może to być nawet nieosiągalny kod. Chodzi o to, aby oszukać linker w myśleniu, które MyClassjest gdzieś używane, aby nie było tak agresywne w optymalizacji.

Xcode 6.3.2 i Swift 1.2

Szybka definicja widoku. Pamiętaj, aby zastąpić init(coder aDecoder: NSCoder). Definicja celu C kontrolera widoku. I stalówka na gruszy.

Dodaj nazwę modułu do inspektora szczegółów stalówki, w którym wybierasz klasę.


2
Dane .xib nie są ładowane w czasie wykonywania. Kompilator IB kompiluje xib do stalówki; stalówka jest ładowana w czasie wykonywania.
Peter Hosey

19
Nie musisz modyfikować MyClass. Wystarczy wywołać metodę to dziedziczy NSObject, jak +class.
jlstrecker

10
Chociaż nie było Xcode 4, kiedy zostało opublikowane oryginalne pytanie, poniższe wydają się nadal odpowiednie. W Xcode 4 zamiast dodawać sztuczną metodę w celu wyeliminowania błędu, możesz sprawdzić wszystkie potrzebne cele MyClass.mw sekcji Członkostwo docelowe w Inspektorze plików.
adr

51
Inną możliwością jest obecnie to, że MyClass.m może nie znajdować się w fazie kompilacji źródeł. Może się to zdarzyć, jeśli przeciągniesz MyClass.h / m do swojego projektu, zamiast tworzyć je za pomocą nowego pliku.
Steven Fisher

6
@JoshBruce, czy możesz wyjaśnić rozwiązanie Swift? Naprawdę tego nie rozumiem.
Ryan Bobrowski,

183

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, który zawiera klasę, na którą narzeka

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


Prawdą jest, że czasami błąd linkera wynika przede wszystkim z tego, że po prostu nie kompiluje się pliku docelowego. Opisujesz sposób kontrolowania celów, z którymi plik jest powiązany. Niestety mój plik był już częścią mojego celu, ale nadal miałem problem z łączem. Prawdopodobnie było to spowodowane tym, że moja biblioteka to C ++ (w przeciwieństwie do Objective-C), która ma różne domyślne flagi linkera (patrz posty Alasdaira Allana i Sijo powyżej).
jhoule,

5
Ta sugestia działała dla mnie, choć nieco inaczej, ponieważ moje pole wyboru „Docelowe członkostwo” zostało już zaznaczone. Odznałem go i przebudowałem, ale potem komunikat o błędzie zmienił się, wskazując nazwę mojej nowej klasy. Ponownie zaznaczając pole i budując ponownie, wszystko działa teraz. Znacznie łatwiejsze niż usuwanie plików pamięci podręcznej!
elektromaggot

Świetne rozwiązanie za pośrednictwem interfejsu użytkownika Xcode. @electromaggot, Xcode może się zdezorientować przy ręcznym dodawaniu klas, więc może być konieczne dodanie więcej niż jednego pliku.
Gonen

To też jest rozwiązanie dla mnie. Przeciągnąłem niektóre pliki klas z innego projektu i te pliki klas były tymi, które zgłosiły wyjątek.
hairbo

1
Usunąłem plik z mojego projektu, a następnie dodałem ten sam plik później i to rozwiązało problem.
MindSpiker

70

To naprawdę nie ma nic wspólnego z Konstruktorem interfejsów, dzieje się tutaj to, że Xcode nie pobiera symboli z biblioteki statycznej. Aby rozwiązać ten problem, musisz dodać -all_load -ObjCflagi doOther Linker Flags klucza Ustawienia kompilacji projektu (i ewentualnie celu).

Ponieważ Objective-C generuje tylko jeden symbol na klasę, musimy zmusić linker do załadowania członków klasy również za pomocą flagi -ObjC, a także musimy wymusić włączenie wszystkich naszych obiektów z naszej biblioteki statycznej poprzez dodanie -all_loadflagi linkera. Jeśli wcześniej lub później pominiesz te flagi, spotkasz się z błędem unrecognized selectorlub wystąpią inne wyjątki, takie jak ten, który tutaj zaobserwowałeś.


5
Odkryłem, że -ObjCsama flaga naprawiła to w moim przypadku.
Kekoa,

5
@Kekoa, ponieważ twoja wersja Xcode (LLVM) jest nowsza niż facet, który napisał tę odpowiedź. W dzisiejszych czasach używanie -ObjCjest wystarczające do rozwiązania problemu.
Do

to tylko mi pomogło. Podczas kompilacji pokazał niezbędne problemy związane z frameworkiem, które również zostały rozwiązane po zaimportowaniu wszystkich frameworków.
Vaibhav Saran

-Obsługa samej flagi rozwiązała mój problem. Naprawdę wystąpił błąd związany z posiadaniem atrybutu all_load w iOS7.
Sushma Satish

Użycie -all_load -ObjC może spowodować niepotrzebny wzrost wielkości produktu. ten problem występuje również w plikach kategorii tylko w ramach.
Ali Amin,

26

Napotkałem dzisiaj ten problem za pomocą Swift.

Zmieniłem klasę Model.h + Model.mna Model.swift. Ten obiekt został użyty w Konstruktorze interfejsów z class = Model.

Gdy tylko wymieniłem obiekt, nie można już załadować klasy.

Musiałem zmienić odniesienie do klasy w IB z:

Class = Model
Module = 

do

Class = Model
Module = <TARGETNAME>

Znajdziesz <TARGETNAME>w ustawieniach kompilacji. Jest to także nazwa wyświetlana w wygenerowanym nagłówku Swift-Header:#import "TARGETNAME-Swift.h"


1
To wydaje się być poprawna odpowiedź. O ile ktoś nie może powiedzieć inaczej, należy to oznaczyć jako poprawne.
Bjørn Ruthberg

1
Świetna odpowiedź dzięki. Dla mnie Modulenazwa znajdowała się właśnie na liście rozwijanej. To była nazwa mojej aplikacji.
ChrisH,

Mi to pasuje. W przypadku mojego problemu nazwa <NAZWA TARGETU> wymieniona w odpowiedzi jest nazwą frameworka, która zawiera klasę.
Tyler Long

Doszedłem do wniosku, że to był także błąd, który otrzymałem i byłem gotów opublikować moje ustalenia, kiedy zobaczyłem twój post. Właściwie to widziałem, ale przeszedłem, z powodu wielu odpowiedzi i hałasu wokół niego. Myślę, że twoją odpowiedź można poprawić za pomocą niektórych zrzutów ekranu, aby odróżnić swoją odpowiedź od innych. Na pewno bym to złapał, gdyby tak było. Bardzo dziękuję za opublikowanie go tutaj. Masz moje poparcie.
jvarela

W przypadku AppDelegate udało mi się to naprawić w interfejsie Konstruktora interfejsów. W przypadku niestandardowej klasy elementu interfejsu użytkownika w oknie interfejs użytkownika Konstruktora interfejsów nie pozwala mi ustawić niestandardowej klasy i modułu. Musiałem wykonać następujące czynności: (1) Otwórz plik .xib jako „Kod źródłowy” (kliknij go prawym przyciskiem myszy). (2) Dodaj atrybut „customModule = <NAZWA TARGETU>” obok atrybutu customClass.
Poulsbo

20

Przejdź do „ProjectName”, kliknij na nią, a następnie przejdź do zakładki „Buduj fazy”, a następnie kliknij „skompiluj źródła”, a następnie kliknij przycisk „+”, pojawi się okno, wybierz „MyClass. m ”plik, a następnie kliknij„ dodaj ”,

Zbuduj projekt i uruchom go, problem z pewnością zostanie rozwiązany


tak, nie zaznaczyłem WSZYSTKICH pól docelowych, do których chciałem dodać moje nowo zaimportowane klasy. Dzięki!
Joel Balmer

Tak! Brakuje mojego pliku VC w projekcie docelowym.
Sebastian Dwornik

19

Jest to problem z pamięcią podręczną Xcode4, wystarczy usunąć wszystkie foldery w folderze / Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /

Również jeśli masz ten sam problem z testowaniem problemów na iPhonie, usuń starą aplikację przed uruchomieniem ...

Powodzenia. Pascual


8
W ustawieniach kompilacji projektu musisz dodać flagi „-all_load -ObjC” do klucza „Inne flagi linkera”. Nie jest to problem specyficzny dla Xcode 4 i faktycznie nie ma on również nic wspólnego z Konstruktorem interfejsów.
Alasdair Allan

To rozwiązanie zostało już zaproponowane w styczniu 2010 r. (Patrz wyżej).
jhoule

6
Tak - najłatwiejszym sposobem na to jest otwarcie symulatora iOS i wybranie z menu „Resetuj zawartość i ustawienia”
RanLearns

Możesz też zrobić to, co zrobiłem i po prostu usunąć aplikację z ekranu głównego Symulatora. Miałem ten sam komunikat o błędzie, ale odwoływał się do starego delegata aplikacji.
spstanley

16

Czasami IBuilder nie trafił customModule="AppName" customModuleProvider="target"

Aby to naprawić, otwórz storyboard 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">

Używanie Xcode 6.3 (6D570), jak tylko uruchomię, ustawienie powraca do pierwotnego (złego). Pluskwa? Próbuję dołączyć szybki plik do projektu Celu C.
addzo

W XCode 6.4 samo dodanie customModuleProvider = "target" w kodzie źródłowym scenorysu pod żądanym kontrolerem widoku rozwiązało problem.
Amro Shafie,

Dzięki niemu udało mi się rozwiązać problem customModule="MyFrameworkName". Ogromny +10
Stan

W rzeczywistości mój problem był odwrotny: chciałem usunąć CustomTaget, ale Xcode nie zmieniał pliku źródłowego xib, więc musiałem usunąć customModule = "AppName" customModuleProvider = "target", aby to działało.
Adriana

14

Mój przypadek - przy próbie użycia klasy z szybkiego frameworka w moim celu c, otrzymałem ten błąd. Rozwiązaniem było dodanie modułu (szybka struktura) klasy w Konstruktorze interfejsów / Storyboard, jak pokazano poniżej. Nic więcej

wprowadź opis zdjęcia tutaj


2
Używam frameworka Swift w projekcie Swift zainstalowanym przez CocoaPods. Ta metoda działa. A nazwa modułu to nazwa frameworka.
JsW

1
To doskonale działa. Chcesz się dowiedzieć, dlaczego ten moduł został usunięty?
iSrinivasan27,

Działa idealnie z problemami frameworka cocoapod ... podziękowania za idealną odpowiedź ...
jayant rawat

13

Przejdź do Fazy kompilacji-> Kompiluj źródła i dodaj nowe pliki .m.


Tak, po dodaniu nowych plików z poprzedniego projektu do projektu XCode 4.5, dodanie plików .m do listy Compile Sources na pewno to zrobiło. Dodanie „-all_load -ObjC” nie działało w moim przypadku, ale nie bolało.
dlaczegooz

13

W moim przypadku pokazywał błąd dla klasy, która nawet nie istniała! Podejrzewałem, że to coś zostało wykorkowane w pliku scenorysu. Jeśli nie rozpoznajesz pliku klasy w błędzie, spróbuj tego:

1) otwórz swój projekt w wysublimowanym lub innym dobrym edytorze. Wyszukaj klasę, do której następuje odwołanie. 2) usuń cały fragment z napisem

customClass="UnrecognizedClassName"

3) zapisz. 4) wróć do xcode i wyczyść projekt, i spróbuj uruchomić go teraz.

pracował dla mnie.

wprowadź opis zdjęcia tutaj


Używam aplikacji OSX TextEdit. Działa dobrze dla tej operacji. Najpierw zamknij projekt i zamknij Xcode.
TJ

To też pomogło. Miałem więcej niż jeden obiekt o tym samym customClass, prawdopodobnie kliknąłem widok zamiast kontrolera i przypisałem tę samą nazwę.
Mc-

1
Takie było również rozwiązanie napotkanego problemu; Wcześniej wprowadziłem częściową nazwę klasy i jakoś zapisano w ten sposób scenorys (np customClass="MyCla".). Zamiast usuwać niestandardowe przypisanie klas, rozsądnie było po prostu umieścić klasę, której zamierzałem użyć w pierwszej kolejności :)
dave

9

Chcę tylko dodać tę odpowiedź, ponieważ większość, jeśli nie wszystkie, odpowiedzi tutaj zakładają, że klasa faktycznie istnieje .. po prostu linker / kompilator jest zbyt głupi, aby go zobaczyć. W ten sposób odpowiedzi obracają się wokół albo ostrzegając linker o istnieniu klasy lub stworzenie hacka w celu „wymuszenia” istnieje…

mój problem zdarza się, gdy ta wiadomość mówi o nieistniejącej klasie .. więc przykładem może być powrót do starej wersji git, która nie ma wiedzy o pewnej klasie .. jednak kompilator narzeka, że ​​wspomniana klasa nie istnieje…

rozwiązanie?

  • Nuke wszystko! najpierw usuń wszystkie pliki kompilacji itp., usuwając całą zawartość tego katalogu ~ / Library / Developer / Xcode / DerivedData
  • usuń aplikację z samego telefonu (i wyczyść zawartość symulatora, jeśli korzystasz z symulatora)

po tym powinieneś być dobry


2
Nie mogę dać +1 temu, naprawiłem mój problem. Mój problem był dokładnie taki sam, gdy plik został już usunięty, ale ostrzeżenie nadal pojawiało się podczas kompilacji.
Brett

W Storyboard musisz wypełnić identyfikator. Czasami przez pomyłkę piszę to w polu „Klasa” (w Inspektorze tożsamości). Kompilator narzeka więc na to, że klasa nie istnieje!
Vincent

9

Najlepszym sposobem, aby usunąć ten błąd jest: 1) Wybierz plik klasy (.m) 2) W „ docelowa Membership ”, „kontrola” entry nazwa projektu


To działa. Pracowałem nad kapsułą iz jakiegoś powodu polecenie instalacji kapsuły zastosowało niewłaściwy cel do jednego konkretnego pliku klasy. Został zastosowany do pakietu zasobów, który miałem. Prawidłowa konfiguracja to Pods- <project-title> - <pod-title>
krosullivan

To mi nie działa. Docelowe członkostwo jest poprawne, ale błąd nadal występuje.
Kokodoko

8

Naprawiłem to, kopiując tekst z klasy.h i .m, usuwając te pliki klas z projektu i tworząc nowe pliki class.h i .m o tej samej nazwie przy użyciu „Dodaj plik”. Następnie wkleiłem kod z powrotem do nowych plików i wszystko działało świetnie. Jakoś pliki nie zostały poprawnie połączone podczas ich tworzenia. Po tym nie musiałem używać żadnych flag linkera.


1
kiedy po raz pierwszy utworzyłem pliki, na końcu nie miałem pliku .m. Próbowałem zmienić nazwę pliku i dodać go ponownie, jednak wciąż musiałem usunąć i ponownie utworzyć plik, zanim xcode był zadowolony.
odyth

Twój plik prawdopodobnie nie był częścią celu. Dodanie go prawdopodobnie zakończyło się domyślnym polem wyboru w odpowiednim celu.
jhoule,

1
To rozwiązanie również działało dla mnie, ale upewniłem się w 100%, że zanim usunąłem pierwszą klasę (.h + .m), sprawdziłem, czy była ona częścią mojego celu. To nie był dla mnie problem. Podobnie jak Laura, właśnie usunąłem klasę i stworzyłem ją ponownie (pod inną nazwą) i działało dobrze, bez żadnych innych rozwiązań na tej stronie.
Nate,

7

WRESZCIE to naprawiłem, zapomniałem dodać następujący kod do mojego pliku .m:

@implementation MyTableViewCell

@end

Stało się tak, ponieważ utworzyłem symbol zastępczy @ interfejs dla mojej komórki tabeli, który miał połączenie z elementem w pliku .xib, ale w Konstruktorze interfejsów występuje błąd, w którym jeśli dla klasy nie podano @implementation, nie może tego znaleźć.

Przeszedłem wszystkie kroki z innych forów przeglądania .xib jako źródła i zobaczenia MyTableViewCell, mimo że skomentowałem to z mojego kodu. Próbowałem zresetować symulator. Próbowałem nawet podzielić wszystkie moje klasy na osobne pliki o tych samych nazwach co interfejsy, ale do tego czasu nic nie działało.

PS z mojego doświadczenia, nie ma znaczenia, czy nazwy plików .h / .m są inne niż nazwy interfejsu @. Mam kilka plików zawierających więcej niż jeden interfejs @ i działają one dobrze.

PPS Mam bardziej szczegółowe wyjaśnienie, dlaczego UITableViewCell i UICollectionViewCell powodują ten błąd na https://stackoverflow.com/a/22797318/539149, a także jak ujawnić go w czasie kompilacji za pomocą registerClass: forCellWithReuseIdentifier :.


6

Dzieje się tak, ponieważ plik .xib ma przestarzały link do starego Delegata aplikacji, który już nie istnieje. Naprawiłem to w ten sposób:

  • Kliknij prawym przyciskiem myszy plik .xib i wybierz Otwórz jako> Kod źródłowy
  • W tym pliku wyszukaj starego delegata aplikacji i zastąp go nowym

Otwórz, ponieważ kod źródłowy już nie istnieje, ale równie łatwo można kliknąć prawym przyciskiem myszy, Pokaż w Finderze, a następnie kliknąć plik prawym przyciskiem myszy i otworzyć w TextEdit. Oczywiście wykonaj kopię zapasową pliku przed wprowadzeniem jakichkolwiek zmian;)
Scott Allen

6

wystarczy dodać poniższy kod na początku metody appdelegate applatoindidfinishlanching, a następnie będzie działać poprawnie

[klasa myclass];


5

Próbowałem tego i innych odpowiedzi wymienionych na tej stronie, z których żadna nie posortowała go dla mnie. Te komentarze (z http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) pomogły:

Po wyszukiwaniu, wyszukiwaniu i wyszukiwaniu w końcu odkryłem nazwę tej usuniętej klasy ukrytej w pliku. Musiałem otworzyć pliki konstruktora interfejsu w kodzie X, klikając je prawym przyciskiem myszy i wybierając opcję „wyświetl jako kod źródłowy”. Potem pojawiło się wyszukiwanie

<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string>
<string>*this was the class name*</string>

Samo usunięcie ostatniego wiersza nie naprawia go niestety, narzekając, że w pliku jest niewłaściwa liczba elementów. Musisz usunąć odpowiednią linię w sekcji linii powyżej, która dotyczy CustomClass.


5

W moim przypadku mam XCode6, plik .m określonej klasy kończy się w niewłaściwym miejscu w fazie kompilacji - powinien być w obszarze Kompiluj źródła , ale kończy się naSkopiuj zasoby pakietu


Dzięki tobie zacząłem przeglądać listę i dowiedziałem się, że mój plik właśnie zaginął, prawdopodobnie kiedy go utworzyłem, nie ustawiłem poprawnie celów
schmru


4

Ten problem nie wydaje się przestarzały.

Miałem ten sam problem z Xcode 8 i rozwiązałem go podobnie jak Smilebot :

  1. Otwórz plik scenorysu jako „Kod źródłowy” w Xcode:

  2. Wyszukaj klasę, do której następuje odwołanie, i usuń cały napis

customClass = "UnrecognizedClassName"

  1. Otwórz ponownie plik scenorysu jako „konstruktor interfejsów - scenariusz” i ponownie przebuduj aplikację.

3

Wystarczy usunąć MyClass.m i .h i ponownie dodać je do projektu, to dla mnie praca.


3

Miałem „Nieznany przycisk ulubionej klasy w pliku konstruktora interfejsów” i prześledziłem go do scenariusza ze scenariuszem, w którym dany przycisk zawierał fałszywą niestandardową klasę „ulubiony przycisk” w polu Klasa u góry Inspektora tożsamości. Chciałem umieścić tę wartość w następnym polu: Identity Label.

Zmiana na „UIButton” rozwiązała problem.



1

Ten błąd pojawił się dzisiaj podczas konwertowania mojej aplikacji aaLuminate na Universal pod Xcode 4. Ta aplikacja jest oparta na szablonie narzędzia i została oryginalnie zbudowana pod Xcode 3.

Aby zaoszczędzić czas, skopiowałem widok główny i odwrotny iPhone'a do odpowiednich nazw w aplikacji Universal. Wystąpił błąd „Nieznana klasa x w pliku konstruktora interfejsów”. W moim przypadku nie było nic w plikach XIB lub obiektach docelowych.

Skopiowałem również plik aaLuminate-Info.plist z innych powodów - miał on stary klucz „Podstawowa nazwa pliku głównego nib” ustawiony na MainWindow.

Jak tylko usunąłem ten klucz, naprawiłem problem!


1

W moim przypadku wystąpił ten błąd, ponieważ próbowałem zapisać część pracy, tworząc nowy projekt, a następnie usuwając kilka plików źródłowych i kopiując pliki źródłowe o tej samej nazwie z działającego projektu. Skopiowałem również mój plik MainStoryBoard, który szukał mojego RootViewController. Jednak gdy usunąłem oryginalny RootViewController, a następnie dodałem go do RootViewController z poprzedniego produktu, najwyraźniej operacja Dodaj pliki nie „sprawdziła” pola docelowego, jak to sugerowano powyżej. Po prostu odwiedzając wszystkie nowo zaimportowane pliki „.m” i upewniając się, że pole docelowego członkostwa zostało zaznaczone, wszystko było w porządku. Wydaje mi się, że działo się tak, że plik scenorysu szukał klasy, która została „wykluczona” z linku, ponieważ nie zaznaczono docelowego członkostwa. Upewnienie się, że wymagane pliki dla celu są tak oznaczone w docelowym członkostwie w inspektorze plików, załatwiło sprawę. Dzięki, Pat! (patrz wyżej)


1

W moim przypadku było tak, ponieważ zadeklarowałem podklasę podklasy komórki UITableView w pliku .h (deklaracja obu podklas była w tym samym pliku .h), ale zapomniałem wykonać pustą implementację drugiej podklasy w plik .m.

nie zapomnij zaimplementować żadnej podklasy podklasy, którą zadeklarujesz w pliku .h! brzmi prosto, ale łatwo zapomnieć, ponieważ Xcode zrobi to za Ciebie, jeśli pracujesz z jedną klasą na plik .h / .m.


1

Miałem „Nieznaną klasę RateView w Konstruktorze interfejsów”, gdzie RateView było podklasą UIView. Upuściłem UIView na moją scenę Storyboard i zmieniłem pole klasy niestandardowej na RateView. Mimo to pojawił się ten błąd.

Aby debugować, zmieniłem nazwę mojej klasy na RateView2 i zmieniłem wszystkie odwołania, aby pasowały oprócz pola Klasa niestandardowa UIView. Komunikat o błędzie nadal pojawiał się tak jak poprzednio, gdy brakowało klasy RateView. Potwierdziło to, że komunikat o błędzie był powiązany z wartością pola klasy niestandardowej. Zmieniłem tę wartość na RateView2, a komunikat o błędzie zmieniono na „Nieznana klasa RateView2 w interfejsie Konstruktora”. Rodzaj postępów.

Na koniec sprawdziłem same pliki kodu źródłowego w Inspektorze plików. Tam odkryłem, że plik kodu źródłowego (który skopiowałem z samouczka) nie był powiązany z moim celem. Innymi słowy, nie miał docelowego członkostwa. Po zaznaczeniu pola, w którym plik kodu źródłowego klasy stał się członkiem aplikacji docelowej, komunikat o błędzie zniknął.


1

W moim przypadku usunąłem klasę o nazwie „viewController”, nie wiedząc, że została wybrana za pomocą inspektora tożsamości scenorysu (w sekcji „Klasa niestandardowa” u góry).

Musisz po prostu wybrać prawidłową klasę kontrolera widoku w polu Klasa niestandardowa inspektora tożsamości lub dodać nową klasę do projektu i wybrać tę klasę jako klasę niestandardową.

Pracował dla mnie!



1

Doprowadziło mnie to do szału i żadna z powyższych sugestii nie pomogła mi pozbyć się błędu. Na szczęście miałem tylko jeden obiekt IB korzystający z klasy, więc właśnie go usunąłem i dodałem z powrotem z tą samą klasą. Błąd zniknął ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.