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

user2597451
źródło
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

Chris Harrison
źródło
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.

Andrew Robinson
źródło
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

Ruud Visser
źródło
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 !!!

MRizwan33
źródło
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

Jesus Rodriguez
źródło
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

Amr Angry
źródło
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.

gmogames
źródło
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

Joe149
źródło
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ęć.
yndolok
źródło
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!

Elliot KG
źródł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.

Hayden Crabb
źródło
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.

Damo
źródło
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)

programista
źródło
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

tungnv
źródło
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

JohnVanDijk
źródło
2

Produkt> Wyczyść (Command - Shift - K) naprawił to dla mnie!

Jangles
źródło
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!
user2480567
źródło
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.

inix
źródło
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.

Separator
źródło
1

Wystarczy wyczyścić i ponownie zbudować projekt.

Carolina Aguilar
źródło
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!

John Nolan
źródło
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

Will Buffington
źródło
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.

Aaron Kreipe
źródło
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ć.

CaptJak
źródło
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

Usuń pliki (tylko odniesienia) i ponownie dodaj pliki.

jomafer
źródło
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.
}
José Roberto Abreu
źródło
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.

Nick DiZazzo
źródło
0

Po prostu spróbuj usunąć pochodne dane z projektu

david.gol
źródło
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 
yousuke
źródło