„Nie można znaleźć żadnych informacji o klasie o nazwie ViewController”


154

Ten błąd doprowadza mnie do szału, odkąd zacząłem używać Xcode (4.6.3). Za każdym razem, gdy próbuję połączyć element Storyboard z moim kodem, otrzymuję błąd:

Nie można znaleźć żadnych informacji dla klasy o nazwie ViewController.

Dzieje się tak również w przypadku klas niestandardowych. Wypróbowałem takie metody jak:

  • Usuwanie danych pełnomocnika.
  • Usuwanie i ponowne dodawanie klas.
  • Ponowne uruchamianie Xcode.
  • Ponowna instalacja Xcode.

Nie mogę przeciągać, przytrzymując klawisz Ctrl, aby tworzyć połączenia w żadnym z moich projektów, bez względu na to, jaka jest klasa. Ten sam problem występuje w przypadku zupełnie nowej aplikacji szablonu. Jeśli wpiszę kod ręcznie, a następnie przeciągnę klawiszem Ctrl, mogę nawiązać działające połączenie, ale nie mogę dodać go automatycznie. Nic, co dotychczas udało mi się znaleźć w Internecie, nie pomogło. Jakieś wskazówki?


Czy masz trzykrotną pewność, że plik ViewController .m znajduje się we właściwym miejscu docelowym? (pole wyboru w panelu inspektora po prawej stronie)
Alfie Hanssen

2
Masz kontroler widoku w swoim scenorysie i określono „ViewController” jako nazwę klasy, której wystąpienie powinno zostać utworzone w celu zarządzania widokiem. Sprawdź każdy kontroler widoku w serii ujęć: wybierz kontroler widoku, spójrz na „inspektora tożsamości” w panelu po prawej stronie i spójrz na właściwość „Klasa niestandardowa”. Jeśli brzmi „ViewController”, oznacza to, że masz problem. Wpisz nazwę klasy, która powinna zarządzać twoim kontrolerem widoku ... lub wstaw UIViewController, aby uzyskać domyślną implementację UIKit.
Nicholas Hart

1
Zmieniłem klasę niestandardową na „UIViewController” w inspektorze tożsamości i nie mogłem już przeciągnąć klawiszem Ctrl ze scenorysu do ViewController.h. Jeśli utworzę nową klasę i spróbuję przeciągnąć do niej ctrl-drag (po odpowiednim ustawieniu klasy kontrolera widoku), otrzymuję ten sam błąd „Could not find any information”.
user2597451

4
Miałem ten problem, a modyfikowanie automatycznie generowanej klasy ViewController działało dla mnie. Np prostu dodaj NSLog()doviewDidLoad:
jb

Odpowiedzi:


292

Rozwiązaniem dla mnie było usunięcie klasy z projektu.

Kroki:

  1. W eksploratorze plików projektu (lewy panel) znajdź klasę i kliknij prawym przyciskiem -> Usuń
  2. Usuń odniesienie (nie przenoś do kosza, bo na dobre stracisz klasę)
  3. Kliknij prawym przyciskiem myszy folder zawierający klasę -> Dodaj pliki do ...
  4. Znajdź właśnie usuniętą klasę w systemie plików

Wydaje się, że zmusza to Xcode do ponownego połączenia klasy z scenorysem.

Uwaga: u mnie nie działały:

  • Zamykanie Xcode
  • Czyszczenie projektu
  • Usunięcie nazwy klasy z serii ujęć i ponowne wprowadzenie jej

Myślę, że to błąd po stronie Apple


8
Próbowałem tego, ale nie zadziałało / -: ten sam błąd.
Michael

1
@Michael, tak, teraz jestem w sytuacji, w której żadne z powyższych w ogóle nie działa. Xcode to ***
Chris Harrison,

5
Ten problem sięga lipca 2013 r., Od dziś maja 2016 r. Pojawia się ten sam błąd i naprawiłem go za pomocą tej odpowiedzi. Dlaczego przez tyle lat Apple nie naprawia tego na dobre?
SkyWalker

3
Nie mogę uwierzyć, że to wciąż problem. Po prostu musiałem to zrobić na XCode 8.1 ..
fisk

2
2017 (wersja 8.2 (8C38)) i wciąż żyje, Xcode SUCKS. Zdarza mi się podczas kopiowania i wklejania personel UI z ujęć z jednej sceny do drugiej
Jaime Agudo

135

Jeśli ktoś nadal jest tym sfrustrowany, jest pewien sposób, aby wszystko działało.

To, co robię, to ręczne wprowadzenie gniazdka do mojej klasy, na przykład: @IBOutlet weak var someView: UIView!i przeciągam z kodu do widoku w IB lub storyboardie. Następnie mogę przeciągnąć z IB / Storyboard do mojej klasy, aby nawiązać połączenia, redaktorzy asystenci rozpoznają klasę w trybie „Automatycznym” itp.

Działa za każdym razem.


6
@ Gmeister4, jeśli utworzysz gniazdko w swoim kodzie, wyświetli się małe kółko po lewej stronie gniazdka. Kliknij i przeciągnij z tego koła do widoku w IB lub Storyboard, aby nawiązać połączenie.
Andrew Robinson

4
Łatwiej niż najlepsza odpowiedź. +1
cph2117

2
Nadal nie mogę tego zrobić we właściwy sposób, nawet po tym - ale przynajmniej to działa!
Alexandre G

1
Żadna z powyższych odpowiedzi nie zadziałała dla mnie. Tylko ta odpowiedź zadziałała dla mnie.
coolcool1994

1
Świetnie, to wszystko!
Sam

38

Dla mnie usunięcie ich z docelowego członkostwa w prawej kolumnie i dodanie ich ponownie załatwiło sprawę wprowadź opis obrazu tutaj


U mnie też to zadziałało. Zduplikowałem klasę ViewController.swift i wydaje się, że to jest rozwiązanie.
UberJames

Myślę, że to błąd Xcode, który nadal istnieje w Xcode 8.0
jiangjiefs

Przydarzyło mi się to teraz w Xcode 8.3.3, a Twoje rozwiązanie jest najprostsze i działa. Więc dziękuję!!!
RoberRM

Nadal istnieją w Xcode 11.5 (mam na myśli poważnie Apple ??). Jedyne rozwiązanie, które u mnie zadziałało, wymienione tutaj.
Christophe Fondacci

12

Czasami Xcode to robi, ponieważ VC nie odwołuje się do pliku klasy. Prostym rozwiązaniem jest:

wpisz własność ręcznie, jak podano.

class YourClassName{

     @IBOutlet weak var YourTableName: UITableView!

}

Spowoduje to utworzenie pustego znaku linku przed @IBOutlet , otwórz projekt w edytorze asystenta, a następnie kliknij znak łącza wprowadź opis obrazu tutaji przeciągnij do widoku, z którym chcesz się połączyć (połączyłem się z TableView). i to wszystko. Życzymy udanego kodowania !!!


8

Właśnie miałem ten problem w kwietniu 2017 z Xcode 8

Po prostu utworzenie gniazdka za pomocą kodu i skompilowanie go naprawiło. na przykład:

@IBOutlet weak var containerViewHeight: NSLayoutConstraint!

Musisz pokochać Xcode…

Edycja: nadal dzieje się na Xcode 9


7

Poniższe kroki działają dla mnie, mam nadzieję, że działa również dla Ciebie

1 - Musisz ponownie otworzyć projekt po zamknięciu Xcode.

2- Poczekaj na indeksowanie plików projektu

3- Sprawdź, czy to działa, czy nie

4- Jeśli nadal nie działa, wykonaj krok 5, jeśli nie jesteś zadowolony :)

5- Oczyść i zbuduj cel projektu

wprowadź opis obrazu tutaj


7

Próbowałem wszystkiego i nie udało się, więc dla mnie zadziałało:

  • Wyczyść folder i projekt kompilacji.
  • Otwórz projekty (Okno -> Projekty)
  • Znajdź swój projekt na liście i usuń pochodne dane
  • Zamknij Xcode
  • Uruchom ponownie komputer (bez wybierania ponownego otwierania otwartych okien)
  • uruchom Xcode
  • Praca!

Wszystkie moje kontrolery widoku nie zostały rozpoznane, więc usunięcie wszystkich plików i ponowne dodanie nie wchodziło w grę, ponieważ jest to duży projekt.


4

U mnie zadziałało:

  1. Wykonaj „wyczyść” i „wyczyść folder kompilacji” (naciśnij „opcja” w menu Produkt, aby uzyskać polecenie „wyczyść folder kompilacji”)

  2. Zatrzymaj Xcode

  3. W terminalu przejdź do folderu danych pochodnych:

    (/ Users // Library / Developer / Xcode / DerivedData)

Usuń katalog danych pochodnych dla swojego projektu.

  1. Machaj w powietrzu martwym kurczakiem

  2. Uruchom Xcode


3

Do tej pory musiałem wykonać kombinację kilku odpowiedzi:

  1. Usuń nazwę klasy niestandardowej z serii ujęć.

(Kliknij żółty przycisk w lewym górnym rogu kontrolera widoku w scenorysie -> przejdź do inspektora tożsamości (opcja + polecenie + 3) -> usuń nazwę klasy niestandardowej u góry)

  1. Usuń odniesienie do pliku kontrolera widoku.

(Kliknij plik prawym przyciskiem myszy -> usuń -> usuń odniesienie)

  1. Dodaj plik kontrolera widoku z powrotem do projektu.

(Kliknij prawym przyciskiem folder, w którym znajdował się plik -> „Dodaj plik do [projektu]”)

  1. Dodaj nazwę klasy niestandardowej z powrotem do serii ujęć.

3

Jeśli ludzie spróbują powyższego, a rzeczy nadal nie działają, dziwną sztuczką, która zadziałała, było dodanie gniazdka w kawałku białej spacji. Działa, jeśli nie ma innych linii bezpośrednio nad lub pod linią, którą dodajesz. Dziwne, ale zadziałało!


3

U mnie zadziałało, zamiast przeciągać połączenie z przycisku do kodu, to:

  1. Kliknięcie żądanego elementu scenorysu.
  2. Otwieranie inspektora połączeń (prawy panel)
  3. Przeciąganie z kółka + do obszaru kodu. Tak jak to:

po tym, jak połączyłem swój kod w ten sposób, od tej pory działał normalnie.


3

Trzymaj się celu!

Dodawałem nową klasę z Xib i zacząłem widzieć ten problem i spędziłem sporo czasu przeglądając odpowiedzi tutaj i sprawdzając, czy coś z tego miało na to wpływ.

Tak się składa, że ​​mam wiele celów w moim obszarze roboczym i często muszę się między nimi przełączać.

Okazuje się, że dodanie nowych plików rozpocznie ponowne indeksowanie w Xcode. Ale jeśli wskazujesz na niewłaściwy cel, indeksowanie prawdopodobnie nie będzie miało znaczenia i podczas przeciągania w celu połączenia Xcode nie będzie w stanie znaleźć Twojej klasy.

W skrócie

Krok 1.

Wybór celu

Upewnij się, że masz ustawiony prawidłowy cel, aby indeksowanie miało sens.


3

To zadziałało dla mnie:

  1. Wykonaj „ Wyczyść folder kompilacji
    (naciśnij i przytrzymaj klawisz „opcja” i przejdź do menu „ Produkt ”, aby uzyskać do niego dostęp.
  2. Wykonaj proste „Wyczyść” (CMD-SHIFT-K) z menu „ Produkt ”.
  3. Budowanie projektu do niech Xcode skompilować pliki. Pozwól też indeksować pliki, jeśli to konieczne.

Na marginesie, nie jestem pewien, czy to pomogło, ale przed wykonaniem powyższych czynności usunąłem również dane pochodne (preferencje Xcode> Lokalizacje)


2

Wybierz ViewController w storyBoard, usuń bieżącą wartość w panelu po prawej stronie / "Klasa klienta" / "klasa", a następnie ponownie dodaj klasę kontrolną (typ: "SampleViewController" ...), wprowadź. -> To działa dla mnie


2

Wypróbowałem wszystkie te odpowiedzi, problem był związany z tym, że Xcode nie mógł indeksować plików. Naprawiłem to, zamykając Xcode i ponownie otwierając projekt. Oczywiście zrobiłem to po wypróbowaniu wszystkich powyższych rozwiązań: str



2

To NAJŁATWIEJSZY krok, który wykonałem, aby rozwiązać ten problem.

  1. Czyszczę projekt
  2. Przeciągnij nowy przycisk w kontrolerze widoku.
  3. Zbuduj projekt.
  4. Podłącz nowo przeciągnięty przycisk do klasy (gniazdka lub akcji).
  5. Następnie voila !!! Inne gniazdka można teraz ponownie podłączyć do klasy!

1

Z mojego doświadczenia w testowaniu wynika, że ​​jeśli usuniesz klasę, która była skojarzona z Xcode, a następnie ponownie dodasz plik, wystąpi ten problem.


1

Zwykle, gdy mi się to przytrafia, po prostu nie zapisałem jeszcze kodu zajęć. Po prostu przeskocz do kodu i naciśnij cmd + s, co często rozwiązuje problem we właściwy sposób.



1

Żaden z powyższych kroków nie zadziałał, ale myślę, że mogłem wykryć problem. Przynajmniej to zadziałało i nie jest to błąd w Xcode.

W edytorze pomocniczym spójrz na górę okna, które zawiera kod dla Twojego elementu viewController. Trzecia opcja od prawej strony prawdopodobnie mówi „Ręcznie”, ale powinna brzmieć „Automatycznie”. Kiedy to zmieniłem, problem został rozwiązany!


1

Miałem podobny problem: „Nie mogłem znaleźć klasy o nazwie…”, a przyczyna była z mojej strony głupia, kiedy to odkryłem. Upewnij się, że nie przeciągasz z elementu do interfejsu - upewnij się, że jest on przeciągany do samej klasy


1

Próbowałem WSZYSTKIEGO!

Upewnij się, że nazwa klasy Twojego UIViewController nie zawiera słowa „Test”

Zgłoszenie błędu zostało przesłane.


Zdecydowanie nie mówię, że to jedyna przyczyna. Tylko tyle, że jest to kolejna rzecz, o której należy pamiętać.
Aaron Kreipe

Pomóż mi usunąć wszystkie dane pochodne, wyczyścić projekt. Ale to jest błąd i masz rację.
Genevios

0

Spróbowałbym przerobić te pliki .m i .h i nadać im oryginalną nazwę, a nie ogólną, taką jak „ViewController”. Spróbuj czegoś więcej na wzór tego, co chcesz zrobić w tym pliku, a kończąc na kontrolerze widoku (np. „PizzaDecoraterViewController”)

Następnie wybierz ViewController, który chcesz połączyć z tymi plikami. Upewnij się, że wybierasz ViewController, a nie tylko obiekt wewnątrz. Kliknij czarny pasek na dole (ten, na którym znajdują się ikony „Pierwsza pomoc” i „Wyjście”). Cały ViewController powinien mieć obrys niebieski. Następnie przejdź do sekcji Custom Class w Identity Inspector. W pierwszym polu powinien pojawić się wyszarzony „UIViewController”. W tym polu wpisz nazwę pliku .h lub .m, z którym chcesz się połączyć (zacznij pisać PizzaDecorator ... i powinno zrobić trochę autouzupełniania). Następnie naciśnij ENTER.

Po otwarciu Edytora asystenta upewnij się, że plik, do którego próbujesz przeciągnąć i upuścić, jest w rzeczywistości właściwym plikiem.

Jeśli zrobiłeś wszystko, co powiedziałeś powyżej, powinno działać.


Niestety nadal nie działa. Próbowałem to zrobić wcześniej, ale bezskutecznie. Oto zrzut ekranu: i.imgur.com/5ixtcps.png
user2597451

Huh. Dziwne. Spróbuj dodać je programowo (tj. @Property (nonatomic, strong) IBOutlet UIView * test;), a gdy pojawi się małe kółko, przeciągnij i upuść do swojego UIView.
CaptJak

To działa i zawsze działa (a aplikacje wydają się działać dobrze), ale próbuję rozwiązać problem, który nie zostanie dodany automatycznie.
user2597451

Cóż, jeśli tak działa, to powinno działać w drugą stronę. Błąd w Twoim XCode? Spróbuj zdobyć poprzednią wersję (na przykład 4.6.2 lub coś podobnego) i zainstaluj ją. W przeciwnym razie, ummmmmmmmmmmmmmm ...... tak ...
CaptJak

Tak, tego się boję. Odinstalowywanie i ponowna instalacja nie działały, miałem nadzieję, że popełniłem błąd. Jaki jest najlepszy sposób na obniżenie wersji mojej kopii Xcode?
user2597451



0

Cóż, w moim przypadku rzecz, która zadziałała (to trochę dziwne, ale zadziałała) jest następująca:

Spróbuj dodać źródło danych (np. Rozszerzenie do ViewController, takie jak UITableViewDataSource). Xcode spróbuje ponownie załadować ViewController. Następnie napisałem jakąś metodę protokołu (na początku Xcode nie uzupełniał metod autouzupełniania, tylko ręcznie), potem dodałem IBOutlets, a na koniec usunąłem źródło danych.

Przykład:

class TestViewController:UIViewController{
    // This viewController presents “Could not find any information for  class named ViewController”
}

extension TestViewController:UITableViewDataSource{
    //Add Some methods of the protocol, Xcode will try to autocomplete and then it's going to reload the class, from then you can add your IBOulets / Actions .. And remove this extension if you don't need it otherwise.
}

0

Dla mnie widok, dla którego określiłem niestandardową klasę, nie mógł zostać skompilowany przez kreatora interfejsu. To było zaznaczone @IBDesignable.

Usunięcie @IBDesignable, a następnie dodanie moich gniazdek, a następnie oznaczenie go jako @IBDesignablerozwiązało problem w moim przypadku.



0

po prostu spróbuj tego

rm -rf ~/Library/Caches/com.apple.dt.Xcode
defaults delete com.apple.dt.Xcode IDEIndexDisable
defaults write com.apple.dt.Xcode IDEIndexEnable 1 
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.