Xcode 4: Tworzenie UIView xib, nieprawidłowe połączenie

84

Próbuję utworzyć końcówkę zawierającą widok, który zostanie osadzony w TableViewCell. Stworzyłem interfejs i pliki implementacji ResultCell.horaz ResultCell.m. Są dostępne po wyjęciu z pudełka, bez zmian w kodzie.

Następnie tworzę pusty plik XIB i przeciągam na niego UIView. Następnie klikam opcję Właściciel pliku i ustawiam typ na ResultCell. Klikam widok i ustawiam jego klasę na ResultCell.

Oto problemy, które mam:

  1. Podczas korzystania z widoku edytora asystenta (w którym mieszkam) ResultCell.hplik nie pojawia się, gdy przeglądam plik ResultCell.xib. Muszę zmusić go do załadowania, klikając Automatycznie i wybierając plik.
  2. Kiedy upuszczam etykietę w widoku, a następnie przytrzymuję klawisz Ctrl i klikam i przeciągam do .h, aby utworzyć gniazdo, pojawia się następujący komunikat o błędzie: „ Nie można wstawić nowego połączenia gniazdka: nie można znaleźć żadnych informacji o klasie o nazwie ResultCell. "

Próbowałem utworzyć i odtworzyć widok, ale po prostu nie działa i zacząłem tracić cierpliwość. Każda pomoc byłaby bardzo, bardzo doceniona!

Tim Sullivan
źródło
Po prostu sam na to wpadłem. Ostatniej nocy zadziałało, a dziś nic. Dam ci znać, jeśli coś znajdę.
Tavison,
Dla przypomnienia, wiele odpowiedzi pomogło mi w ciągu ostatniego roku. Najnowsze wersje Xcode poprawiły rzeczy.
Tim Sullivan,

Odpowiedzi:

82

Może to nie działać w przypadku konkretnego problemu, ale czasami pojawia się ten błąd podczas pracy z nowo utworzonymi końcówkami. Usunięcie i ponowne utworzenie końcówek i kontrolerów widoku o takich samych nazwach jak poprzednio nie rozwiązało problemu, ale ponowne uruchomienie Xcode tak.

Zdefragmentowano
źródło
+1 dla mnie też zadziałało. Po prostu uruchom ponownie XCode, a teraz mogę CTRL + przeciągnąć, aby utworzyć nowe @właściwości w moim pliku .h.
Mike Gledhill
1
Odpowiedź Davida Pisoniego zadziałała dla mnie. Po prostu ponowne uruchomienie Xcode nie zmniejszyło musztardy.
Andy
Nie miałem tego problemu w wielu wydaniach Xcode teraz, więc prawdopodobnie jest inna przyczyna, która jest teraz bardziej rozpowszechniona niż ta, której doświadczałem, kiedy pisałem tę odpowiedź w zeszłym roku.
Zdefragmentowano
@Defragged możesz również dołączyć krok czyszczenia pamięci podręcznej, naciskając Command K przed cytowaniem lub nawet lepiej, aby wyjść z Xcode i wyczyścić pamięć podręczną ( ~/Library/Developer/Xcode/DerivedData)
user1046037
Pracuję z Xamarin Studio. Musiałem zamknąć xcode i xamarin studio, a następnie ponownie otworzyć Xamamrin Studio i otworzyć stąd plik XIB, który został uruchomiony w xcode. Asystent redaktora otworzył się poprawnie.
Dave Haigh,
113

Właśnie dzisiaj doszedłem do podobnego stanu. To było bardzo dziwne: mogłem dołączyć dowolny XIB (nowy lub istniejący) do dowolnej już istniejącej klasy ViewController w projekcie, ale nie mogłem utworzyć nowego ViewController i podłączyć go poprawnie do żadnego XIB. Nie działała funkcja „asystenta”, ani funkcja połączenia między IB do pliku nagłówkowego.

Zamknięcie projektu i ponowne otwarcie tego nie rozwiązało.
Zamknięcie XCode i ponowne uruchomienie nie naprawiło tego.
Utworzenie nowego projektu i przetestowanie funkcjonalności działało dobrze, co doprowadziło mnie do wniosku, że gdzieś w jakiejś pamięci podręcznej jest coś uszkodzonego.

Moje rozwiązanie

  • Zamknij swój projekt.
  • Przejdź do folderu ~ / Library / Developer / XCode / DerivedData i USUŃ wszystkie podfoldery odnoszące się do projektu, nad którym pracujesz.
  • Otwórz swój projekt w XCode. Teraz problem powinien zostać rozwiązany.

Nawiasem mówiąc, samo przeprowadzenie pełnego czyszczenia nie wydawało się wyjaśniać sprawy. Musiałem skasować uzyskane dane. Jestem pewien, że dostałem się na tę pozycję z powodu gier git, w które grałem, ale nie miałem pojęcia, jak się z tego wydostać, ponieważ nawet powrót do wcześniejszych wersji gita nie pomógł. (To była również duża wskazówka, że ​​sam projekt nie wyśledził tego).

David Pisoni
źródło
6
Właśnie zalogowałem się do SO na moim Macu, żeby móc zagłosować za tą odpowiedzią! Całkowicie mi się udało. Doprowadzało mnie to do szału, ponieważ dopiero uczę się obsługi XCode i jest to wystarczająco trudne bez takich absurdalnych problemów. :) Dziękuję Ci!!!
Dave,
2
działa nawet bez ponownego uruchamiania xcode; po prostu usunięcie danych pochodnych i odbudowanie (w projekcie iOS)
nob
To zadziałało, gdy ponowne uruchomienie xcode nie zadziałało. Nie mam pojęcia, jak to się stało, że metoda Davida Pisoniego zadziałała świetnie.
mmopy
Niesamowite. Skąd wiedziałeś? Pracował dla mnie.
piątek
1
lol dobrze jest wiedzieć, że IOS i xcode mogą być tak samo błędne, jeśli nie bardziej niż używanie zaćmienia i Androida: p
James andresakis
14

Właśnie miałem ten problem i ponowne uruchomienie Xcode go nie naprawiło. Usunąłem pliki klas z projektu, a następnie dodałem je z powrotem i zaczęło działać.

jasongregori
źródło
13

Miałem ten sam problem. I próbowałem:

  • Ponowne uruchamianie Xcode
  • Usuwanie danych pochodnych
  • I wiele więcej

Nic z tego nie działało. Udało mi się po prostu:

  • Usuń „podejrzane” pliki klas z projektu (po prostu usuń odniesienia, co?)
  • Dodaj je ponownie do projektu

I zrobione!

Dr Kameleon
źródło
2
To zadziałało dla mnie, dziękuję! To była pierwsza rzecz, którą próbowałem, poza ponownym uruchomieniem XCode, ponieważ wydawało się to najmniejszą ilością pracy i ryzyka, i działało świetnie.
adriandz
1
pracował dla mnie po ponownym uruchomieniu xcode i usunięciu danych pochodnych nie
elad s
1
Ten też załatwił sprawę dla mnie. Może to mieć coś wspólnego z refaktoryzacją nazw klas (co właśnie zrobiłem wcześniej).
ekotax
9

Jeśli ponowne uruchomienie Xcode nie działa, odkryłem, że przełączanie nowego pliku .m na zewnątrz i z powrotem do członkostwa docelowego działa.

Duane Fields
źródło
3

To mi pomogło:

  1. z panelu pliku projektu (lewa strona) wybierz uszkodzony plik XIB.
  2. Kliknij ikonę właściciela plików w widoku edytora.
  3. z panelu właściwości (prawa strona) wybierz trzecią zakładkę (u góry)
  4. określ „Klasę niestandardową”

Jeśli nie widzisz „panelu”, spójrz na prawy górny róg okna i włącz odpowiednie przyciski „widoku”. Jeśli nie widzisz przycisków „widok”, kliknij znajdujący się najbardziej po prawej stronie przycisk kapsułki.

Ivan Dossev
źródło
Niedawno zmieniłem (refaktoryzowałem) nazwę klasy. Klasa niestandardowa, jak wspomniano w tej odpowiedzi, nadal miała starą nazwę. Zmieniono to na nową nazwę i zostało to naprawione.
PaulMrG,
2

Zauważyłem, że plik .m został przeniesiony do folderu en.lproj.

Po prostu usuń (tylko jako odniesienie) plik .m z Xcode i przenieś .m z en.lproj. Dodaj go ponownie, to rozwiąże problem.

Nie martw się, odzyskasz wszystkie połączenia.

TAK JAK
źródło
Mój .m został wygenerowany automatycznie i jeszcze go nie zmieniłem. Zrobiłem i wszystko było w porządku. Nic innego nie działało.
entonio
2

Dzisiaj napotkałem ten sam problem. Ponowne uruchomienie XCode nie rozwiązało problemu. Udało mi się dostać rzeczy wraca do normy za pomocą „Usuń” opcji „Odczytane dane” w projekcie , które można znaleźć pod Organizatora . Organizator mówi, że „dane pochodne obejmują indeks, dane wyjściowe kompilacji i dzienniki”. Wydaje mi się, że ten problem powodował indeks lub dane wyjściowe kompilacji .

Praveen Kumar
źródło
2

w XCode przejdź do organizatora, kliknij projekt, kliknij usuń dane pochodne ... potem wyczyść projekt

Peter Lapisu
źródło
2

W moim przypadku pomogło to zrobić "fałszywą zmianę" (tylko spacja) w odpowiednim pliku nagłówkowym.

jakob.j
źródło
Myślę, że to też mogło zrobić to dla mnie. W moim przypadku gniazdko dodałem ręcznie. Byłem wtedy w stanie podłączyć do niego mój makaron, a także stworzyć nowe punkty sprzedaży przez przeciąganie ctrl.
Daniel Wood,
1
  1. ResultCell powinna być podklasą klasy UITableViewCell
  2. Nie powinieneś przeciągać UIViewna puste płótno, powinieneś przeciągnąćUITableViewCell
  3. Powinieneś wybrać komórkę i zmienić na swoją podklasę
  4. Właścicielem jest najczęściej kontroler z wyjściem do celi

Za każdym razem, gdy chcesz wczytać nową komórkę, zadzwoń:

 [[NSBundle mainBundle] loadNibNamed:nibName 
                               owner:controllerWithOutletToCell 
                             options:nil]

po załadowaniu użyj ogniwa i ustaw ivar / wylot na zero, gotowy do następnego obciążenia

są inne sposoby, ale jest to powszechne

bshirley
źródło
Jeśli to zrobię, mam dokładnie ten sam problem. Edytor pomocniczy nie wyświetla .h, gdy przeglądam końcówkę, a naciśnięcie Ctrl + przeciąganie nie tworzy kodu gniazdka, wyświetla błąd.
Tim Sullivan,
2
Czy używasz Xcode 4.0.2? Możesz ręcznie ustawić asystenta edytora, jeśli działa nieprawidłowo. Zakładam, że ponownie uruchomiłeś aplikację, aby ponownie przetestować ten problem (Xcode 4 często na tym korzysta). Wygląda na to, że nie może znaleźć plików klas w projekcie lub coś jest źle nazwane - ważna jest wielkość liter. Czy projekt jest obecnie budowany? Jest to funkcjonalność bardzo wysokiego poziomu, która zależy od nowej technologii kompilatora.
bshirley,
Aw, niech mnie. Tak, ponowne uruchomienie Xcode i natychmiast zaczęło działać. - Przepraszam, rzucę się teraz na swój miecz.
Tim Sullivan
1

Być może to, co zadziałało w moim przypadku, to ... (Xcode v4.5)

To nie zadziałało

Próbowałem kontrolować przeciąganie do definicji interfejsu mojego .h

@interface SearchViewController : UIViewController

@end

To zadziałało (może tak miało działać, wcześniej tego nie wiedziałem) Zobacz nawiasy otwierające i zamykające. Kontroluj przeciąganie i upuszczanie po zamkniętym nawiasie.

@interface SearchViewController : UIViewController
{
}

@end
Mouli
źródło
1

Podobny problem miałem z projektem napisanym w języku Swift.

Udało mi się skonfigurować IBOutlet w kodzie takim jak ten

@IBOutlet var foo: UIView?

a następnie połącz go z Interface Builder, przeciągając do małego kółka, które pojawiło się tuż obok linii kodu.

Patrick
źródło
To JEDYNY sposób, w jaki mogłem sprawić, by działał również dla mnie. Postępowałem zgodnie z samouczkiem Apple napisanym dla Objective-C (Zacznij tworzyć aplikacje iOS już dziś) i potrzebowałem połączyć pole tekstowe Nowa pozycja do wykonania. Wreszcie utworzyłem @IBOutlet var textField: UITextField? i podłączony do tego, i zadziałało. Korzystanie z XCode 6.4
andrewz
1

Żadne z powyższych obejść nie rozwiązało problemu ze złączem, więc odłożyłem projekt zwierzaka na półkę, dopóki nie natknąłem się na następujący wątek przepełnienia stosu:

https://stackoverflow.com/a/15873770/2846800

Pracowałem nad dużym projektem w poprzedniej wersji XCode i wyłączyłem indeksowanie. Po ponownym włączeniu indeksowania mój problem został rozwiązany:

defaults delete com.apple.dt.XCode IDEIndexDisable

Mogę teraz korzystać z funkcji D&D programu Interface Builder. Mam nadzieję, że to pomoże innym ...

user2846800
źródło
1

Ten problem wydaje się być błędem Xcode, który skrada się głównie po zastąpieniu pliku nowym plikiem o tej samej nazwie. Wydaje się, że Xcode zachowuje odniesienie do starszego pliku o tej samej nazwie.

W każdym razie sposobem na naprawienie tego wydaje się być:

  1. Wyczyść projekt
  2. Kliknij (Twój projekt) w widoku Nawigatora projektu. Przejdź do Compile Sources w obszarze Build Phases celu, dla którego budujesz. Usuń i dodaj ponownie plik .m, który sprawia kłopoty.
  3. Alternatywnie, w Inspektorze plików (widok Utilities) pliku NIB, w obszarze Członkostwo docelowe, usuń zaznaczenie i sprawdź ponownie nazwę docelową.
  4. Zrestartuj Xcode, aby uzyskać dobrą miarę.
  5. Oczywiście samo usunięcie i dodanie z powrotem pliku .m powinno również to naprawić.

(Same kroki 1 i 2 naprawiły to za mnie.)

codeburn
źródło
0

Jeśli skopiowałeś pliki z innego projektu, po prostu upewnij się, że zaznaczyłeś pole „Dodaj do celów”

John67
źródło
0

Podobny objaw, ale inna przyczyna.

Najwyraźniej uderzyłem w backspace, gdy fokus był na widoku asystenta, ponieważ jeden ze standardowych wierszy komentarza szablonu pliku przeszedł z // do /, co powoduje, że plik nie kompiluje się.

Naprawienie komentarza pozwoliło SDK przeanalizować plik, rozpoznać go jako UIViewController i dodać do wyjścia.

SO - jeśli masz ten problem, wykonaj kompilację lub analizę, aby sprawdzić, czy są błędy, które wymagają naprawy w pliku .h kontrolera widoku. WTEDY wypróbuj inne rozwiązania.

oprogramowanie ewoluowało
źródło
0

Może to być stary temat, ale na wypadek, gdyby ktoś miał ten sam problem w przyszłości, spróbuj usunąć powiązane pliki .xib, .h i .m i utwórz nowe. Dla mnie kontroler UIViewController w moim pliku .h nie był fioletowy, a nawet cofanie się i wpisywanie nie pomogło.

SG
źródło
0

Po prostu umieść linię między @implementation a @synthesize. Większość odpowiedzi tutaj ma to wspólne. U mnie to zadziałało

@implementation 

@synthesize
user2371963
źródło
0

Po prostu wypróbowałem tutaj wszystko i nic nie działało (używając programu Developer Preview dla Xcode 5).

Jedyną rzeczą, która zadziałała, było umieszczenie tej niekompletnej linii w moim pliku interfejsu:

@property (nonatomic, weak)

Z jakiegoś powodu dodawanie gniazd i działań metodą przeciągnij i upuść z pliku .xib działało potem dobrze.

dżibuti33
źródło
0

Dla mnie czyszczenie lub usunięcie DerivedData rozwiązało problem.

Kilkakrotnie próbowałem usunąć i odtworzyć moją klasę UIViewController i ciągle napotykałem ten problem.

Następnie ponownie utworzyłem klasę UIViewController i nadałem jej inną nazwę. To rozwiązało problem.

Fabian Stark
źródło
0

Miałem ten problem i znalazłem rozwiązanie nie wymienione powyżej.

W moim przypadku mogłem zobaczyć, że coś jest nie tak w pliku .h klasy, ponieważ mój niestandardowy kontroler widoku nie rozpoznał klasy: UIViewController (był w kolorze czarnym, a nie fioletowym). Wszystkie inne kontrolery widoku niestandardowego miały: UIViewController w kolorze fioletowym.

w moim przypadku i prawdopodobnie w twoim przypadku musiałem dodać klasę do listy rozwijanej cele / fazy kompilacji / źródła kompilacji. Należy dodać .m. Były tam wszystkie inne pliki .m, ale nie ten.

Po dodaniu: UIViewController pojawił się na fioletowo i wszystko działało dobrze.

Michendo
źródło
0

W moim przypadku mam wiele projektów z kilkoma innymi zależnościami. Próbowałem go rozwiązać, usuwając dane pochodne lub ponownie uruchamiając XCode, ale to nie zadziałało. W końcu wypróbowałem następującą metodę i działa:

Przejdź do celu> Buduj tylko architekturę docelową> i ustaw opcje debugowania i wydania na NIE.

Ustaw to dla wszystkich projektów w obszarze roboczym i skompiluj ponownie, aby upewnić się, że nie ma innych błędów. Może bez sensu, ale jakoś to zrobiło. Podczas kompilacji wystąpiły inne problemy, takie jak błędy konsolidatora i nie znaleziono symboli.

morph85
źródło
0

W przypadku pliku * .m tej klasy otwórz „Pokaż inspektora plików” i odznacz „Członkostwo docelowe” dla tego projektu, a następnie wykonaj Wyczyść (menu Produkt-> Wyczyść) i ponownie zaznacz „Członkostwo docelowe” dla tego projektu

wprowadź opis obrazu tutaj

Kozlov V
źródło
0

Używając Swift, miałem podobny problem. Dowiedziałem się, że częścią problemu były dla mnie komentarze .

Wykorzystałem domyślny kontroler widoku, wykonałem w nim jakąś pracę, a następnie utworzyłem drugi kontroler widoku, kopiując cały pierwszy, rozcinając go tylko do viewDidLoad () i zmieniając nazwę klasy na TestViewController. Kompilacje działały, kod został wykonany. Wszystko było dobrze.

Kiedy poszedłem przeciągnąć UITextField w celu utworzenia gniazdka, nie pozwolił mi. Zauważyłem, że moje komentarze nadal mówiły „ViewController.swift”, więc zmieniłem tekst komentarza na „TestViewController.swift” i przebudowałem. Udało mi się podłączyć gniazdko!

Zastanawiam się, czy doszło do tego, że Indexer czytał komentarze, a także nazwy klas, i jakoś się pomylił.

Antonio Ciolino
źródło
0

Mam nadzieję, że to komuś pomoże.

Musiałem tylko usunąć wyprowadzony folder danych. Musisz kliknąć Okno -> Organizator -> Projekty -> Usuń pochodne dane

I PONOWNIE URUCHOM XCODE.

Powinieneś być gotowy do drogi!

Ronaldoh1
źródło
0

Nowa klasa nie będąca częścią „DOCELU” jest prawdopodobnie główną przyczyną tego, o czym wspominają niektóre z tych odpowiedzi.

Podczas tworzenia nowej klasy kakao, domyślnie opcja dodawania nowej klasy do celu jest domyślnie zaznaczona, ale z jakiegokolwiek powodu nie powinno to być zaznaczone po naciśnięciu przycisku Zapisz, pojawi się ten problem.

Nowy cel klasy

Każde z tych obejść, które dodają nową klasę do celu aplikacji, będzie działać w celu rozwiązania problemu i jest czymś, co łączy wszystkie te „poprawki”.

Myślę, że XCode prawdopodobnie ma pewne błędy, które powodują, że nowy plik domyślnie NIE jest dodawany do głównego celu aplikacji. Poprawka sprowadza się do dodania „zepsutej” klasy do głównego TARGETU

Michael Bopp
źródło
0

W XCode 7.1 dodanie łącznika w innym punkcie mojego pliku źródłowego działało. Błąd, który otrzymałem, dotyczył jednej z moich zmiennych, tak jakby to była klasa (nie miał sensu). Błąd przestał występować, gdy dodałem złącze poniżej tej zmiennej zamiast nad nią.

user2683747
źródło
0

Istnieje również inny powód tego problemu ... jeśli utworzyłeś nowy plik klasy kakao z szablonem innym niż ios ... może się zdarzyć ...

Rozwiązaniem byłoby usunięcie go i ponowne utworzenie z odpowiednim szablonem wprowadź opis obrazu tutaj

Mihir Mehta
źródło