Załadowana stalówka, ale ujście „widok” nie zostało ustawione

742

Dodałem nowy plik stalówki do mojego projektu i próbowałem go załadować.

Jednak po kliknięciu ikony paska narzędzi, która ma zabrać mnie do utworzonego przeze mnie widoku, pojawia NSInternalInconsistencyExceptionsię komunikat:

Zamykanie aplikacji z powodu nieprzechwyconego wyjątku „NSInternalInconsistencyException”, powód: „- [UIViewController _loadViewFromNibNamed: bundle:] załadował końcówkę„ ... ”, ale ujście widoku nie zostało ustawione.”

Otworzyłem więc plik stalówki i widzę, że nie ma żadnych zestawów punktów odniesienia. Próbuję jednak kliknąć i przeciągnąć kółko dla „nowego ujścia odniesienia” do właściciela pliku, ale nie pozwoli mi to ... co muszę zrobić, aby wyświetlić mój widok?

Jan
źródło
1
Najpierw spróbuj wyczyścić kompilację.
LetynSOFT 17.04.15
W moim przypadku prawdziwym błędem było zdefiniowanie metody w viewController (- (void) setValue: (NSNumber *) wartość forKey: (NSString *) klucz), która przesłania metodę ViewController powodującą błąd. Rozwiązałem zmianę nazwy tej metody
christian mini

Odpowiedzi:

1806

Macie rację, ale ponieważ jestem nowicjuszem, zajęło mi to trochę czasu, aby wymyślić wszystkie kroki, aby to zrobić. Oto, co zadziałało dla mnie:

  • Otwórz plik XIB powodujący problemy
  • Kliknij ikonę właściciela pliku na lewym pasku (górny, wygląda jak żółte obramowane pole)
  • Jeśli nie widzisz prawego paska bocznego, kliknij trzecią ikonę nad „widokiem” na pasku narzędzi. Spowoduje to wyświetlenie paska bocznego po prawej stronie
  • Na pasku bocznym po prawej stronie kliknij trzecią kartę - tę, która wygląda trochę jak gazeta
  • W górnej części „Klasy niestandardowej” upewnij się, że Klasa to nazwa ViewController, która powinna odpowiadać temu widokowi. Jeśli nie, wprowadź go
  • Na pasku bocznym po prawej stronie kliknij ostatnią kartę - tę, która wygląda jak koło ze strzałką
  • Powinieneś zobaczyć „wyloty” z „widokiem” pod nim. Przeciągnij koło obok niego do ikony „widok” na lewym pasku (dolny wygląda jak biały kwadrat z grubym szarym konturem
  • Zapisz xib i uruchom ponownie
Josh Justice
źródło
Ten problem również dotyczył kakao i dopóki widok nie został załadowany / dodany do hierarchii widoków, wszystkie ujścia widoków miały wartość NIL. Po wywołaniu addSubview lub czegoś podobnego wszystkie gniazda zostały podłączone. Zabawne było to, że po viewcontroller.view.subviews pokazał brakujące obiekty.
Apoc,
11
To rozwiązanie nie działa już w Xcode 7.3 od kroku 4 i 5. Zamiast tego w narzędziu do tworzenia interfejsów przeciągnij klawisz Control z właściciela pliku do widoku.
PeiweiChen
2
Nie działało dla mnie (brak sekcji gniazd w inspektorze połączeń, dlatego nie ma „widoku” pod gniazdami, z którymi można się połączyć), ale +1 za wysiłek włożony w odpowiedź. :)
William T. Mallard
2
Jeśli nie widzisz „widoku” w gniazdach, możesz również przeciągnąć ctlr z właściciela pliku do widoku na serii ujęć. Powinno pojawić się menu kontekstowe z opcją „zobacz”
Josef
1
@ WilliamT.Mallard Mam takie samo zachowanie. MyViewControllerjest podklasą podklasy UIViewControlleri nie ma jej vieww „Outlets”. Jeśli podklasę MyViewControllerbezpośrednio z UIViewControllerwidoku pojawia się „Wyloty”. Magia lub błąd Xcode.
user2319066
201

To jest propozycja Josh Justice, ale graficznie (zdjęcia są moje):

  1. Wybierz Właściciel pliku
  2. Po prawej stronie wybierz niestandardową klasę.
  3. Wprowadź niestandardową nazwę klasy

wprowadź opis zdjęcia tutaj

  1. Na panelu po prawej stronie wybierz oultets
  2. Przeciągnij widok ujścia, aby wyświetlić komponent

wprowadź opis zdjęcia tutaj

Wreszcie kontroler widoku jest tworzony przy użyciu ruchomego kodu:

        PTFilterUserVC *aFilterUserVC = [[PTFilterUserVC alloc] initWithNibName:@"FilterVC" bundle:nil];

        //OPTIONAL.This is how 'I' am interested in present the view controller.
        [self.navigationController pushViewController:aFilterUserVC animated:YES];
Javier Calatrava Llavería
źródło
1
Dzięki Javier Calatrava Llavería ... bardzo mi pomógł po godzinnym uderzeniu w głowę !!!
BharathRao
un exito muchas gracias
Bruno Sosa Fast Tag
Brakowało mi piątego kroku
hamada147
73

Zasadniczo mogę to naprawić, zmieniając połączenie między właścicielem pliku a widokiem. Przeciągnij z wciśniętym klawiszem Control od właściciela pliku do swojego widoku (w IB) i wybierz widok z wyskakującego menu.

Rohit Mandiwal
źródło
62

Wyświetl tożsamość - Tożsamość klasy nie została ustawiona. Po ustawieniu odpowiedniej klasy problem został rozwiązany.

Jan
źródło
Cześć, John, Zrobiłem to, ale wciąż otrzymuję ten wyjątek.
Mansuu ....
29

Czy na pewno masz UIView (lub podklasę) przypisany do właściwości „view” swojego kontroleraViewView?

Kliknij prawym przyciskiem myszy „File Owner” w lewym okienku xib dla twojegoViewController i sprawdź, czy ujście „view” jest ustawione. Jeśli nie, ustaw go w widoku!

to zdecydowanie rozwiąże problem

Shehbaz Khan
źródło
2
Jasna, zwięzła odpowiedź.
sark9012
15

Dla mnie wszystkie rzeczy tutaj wymienione https://stackoverflow.com/a/6395750/939501 były prawdziwe, ale nadal zgłaszał błąd, powodem było to, że utworzyłem klasę View o nazwie ABCView, a następnie usunąłem ją później dodałem kontroler widoku jako ABCViewController, więc w jakiś sposób odnosiło się to do starego ABCView w nowym kontrolerze widoku, musiałem usunąć ABCViewController i dodać nowy o innej nazwie, który rozwiązał mój problem.

Dzięki

Vishal Dharankar
źródło
Wciąż błąd w 2020 roku.
Tamás Sengel
15

Miałem ten sam problem z XCode 4.6.3. Zacząłem się z kilku plików o nazwach MySettingsView.ha .mjednak usunięte ich korzyść MySettingsViewController.h, ale mimo starając większość podpowiedzi tu wspomnieć, to nadal utrzymuje erroring z,

2013-07-05 11: 48: 17.205 MyApp [39024: c07] *** Zamykanie aplikacji z powodu nieprzechwyconego wyjątku „NSInternalInconsistencyException”, powód: „- [UIViewController _loadViewFromNibNamed: bundle:] załadował stalówkę„ MySettingsView ”, ale ujście nie zostało ustawione.

Najwyraźniej nadal był „zdezorientowany”, próbując załadować MySettingsView.xib zamiast MySettingsView Controller .xib. Może jego logika „rób, co mam na myśli” jest zbyt wymyślna.

Więc obejrzałem ten problem, wpisując na stałe nazwę NIB / XIB w MySettingsViewController.m:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:@"MySettingsViewController" bundle:nibBundleOrNil];
}
Nathan
źródło
10

Dla każdego, kto używa metody Xib do utworzenia UIView i ma ten problem, zauważysz, że nie będziesz mieć ujścia „widok” w menu inspektora połączeń. Ale jeśli ustawisz niestandardową klasę Właściciele pliku na UIViewController, a następnie zobaczysz ujście „widok”, które możesz po prostu CMND podłączyć ujście do CustomView.

manapate
źródło
Niesamowite. Dziękuję bardzo. To powinna być zaakceptowana odpowiedź!
Rzym.
7

Mój problem z tym był spowodowany tym, że w folderze klasy znajdowała się zdublowana końcówka, która nie miała ustawionego widoku. Wyglądało na to, że xcode wybrał jedną końcówkę do kompilacji, a potem drugą przy następnym tworzeniu projektu. Właśnie usunąłem drugi. Wygląda dobrze. Doh!

Matt
źródło
6

Po prostu spędziłem ponad godzinę próbując dowiedzieć się, dlaczego moja właściwość view nie jest ustawiona w moim kontrolerze widoku po zainicjowaniu jej z końcówki. Pamiętaj, aby wywołać „[super initWithNibName ...]” wewnątrz initWithNibName kontrolera widoku.

Kamil.S
źródło
5

Właśnie to naprawiłem w moim. Duży projekt, dwa pliki. Jeden to „ReallyLargeNameView”, a drugi to „ReallyLargeNameViewController”

W oparciu o drugą odpowiedź wybraną powyżej zdecydowałem, że powinienem wyczyścić moją kompilację. Nada, ale wciąż byłem podejrzany o XCode (ponieważ mam dwie identyczne klasy, powinienem je wyodrębnić, ale eh ...) Więc ktoś pracuje, nie ma. Nazwy właścicieli plików są do tej pory kopiowane i wklejane, gniazdka ponownie podłączone, xCode ponownie uruchomiony, wciąż nic.

Więc usuwam podobną nazwaną klasę (która jest widokiem). Wkrótce nowy błąd „wylot wewnątrz nie jest podłączony” dosłownie brzmiał „webView nie kluczowa wartość” bla ... mówiąc w zasadzie „Visual Studio jest lepszy”. W każdym razie ... Usuwam mniejszy nazwany plik i bam, to działa.

XCode jest mylony przez pliki o podobnych nazwach. Projekt jest na tyle duży, że trzeba go trochę zrestartować, co może być jego częścią.

Chciałbym mieć bardziej techniczną odpowiedź niż „XCode jest zdezorientowany”, ale cóż, xCode jest w tym momencie bardzo zdezorientowany. Nie pomieszałem tego w ten sam sposób, w jaki pomogę małemu dziecku. Działa teraz :) Powinien przynieść korzyści innym, jeśli powyższe nic nie naprawi.

Zawsze pamiętaj, aby wyczyścić swoje kompilacje (usuwając również symulator)

Stephen J.
źródło
4

Miałem również ten sam problem i mój problem polegał na tym, że dodałem inną lokalizację (w języku angielskim) do końcówki ViewControllers, aby moja aplikacja z niemieckim językiem lokalizacji nie mogła znaleźć końcówki z językiem lokalizacji w języku angielskim !! Mam nadzieję, że to pomoże każdemu!

Weini
źródło
4

Miałem ten sam problem, gdy przypadkowo usunąłem referencję xib i dodałem ją ponownie. Naprawiłem to, nawiązując połączenie między właścicielem plików i widokiem. Upewnij się również, że klasa niestandardowa FilesOwner jest oczekiwanym kontrolerem viewController.

Nidhin
źródło
3

Dla mnie problem był spowodowany dzwonieniem initWithNibName:bundle:. Korzystam z komórek widoku tabeli z pliku stalówki do definiowania formularzy wejściowych, na których siedzą tableViews. Ponieważ nie mam widoku, nie ma sensu się do niego przyczepiać. Zamiast tego, jeśli wywołam initWithStyle:metodę, a następnie z niej załaduję plik stalówki, wtedy wszystko będzie działać zgodnie z oczekiwaniami.

DaveDude
źródło
3

Poprzednie odpowiedzi prawie rozwiązały dla mnie problem, ale brakowało ostatniego kroku.

  1. Utwórz plik xib i szybki o tej samej nazwie.

Dodaj widok i szybki plik

  1. Ustaw właściciela pliku na podklasę UIView.

wprowadź opis zdjęcia tutaj

  1. Przeciągnij ujście z widoku do podklasy UIView, nadaj mu nazwę „contentView”

dodaj widok zawartości

  1. Dodaj ten niestandardowy inicjator, aby po załadowaniu xib dołączał contentView

dodaj widok zawartości jako widok podrzędny

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        Bundle(for: self.classForCoder).loadNibNamed("SampleView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }

Teraz wszystkie dodane @IBOutlety zostaną dołączone.

Na zdrowie, Richard

PIEKARNIK COSMO
źródło
2

Miałem ten sam problem, ale wymagało nieco innego rozwiązania. Problemem w tym przypadku była klasa właściciela pliku, a nie klasa widoku. Aby to ustawić, musiałem kliknąć ikonę „odtwarzanie wstecz” w lewym dolnym rogu okna Konstruktora interfejsów, a następnie pojawiły się opcje, które izolowały cechy właściciela pliku, pierwszego obiektu odpowiadającego i widoku. Kliknięcie pierwszego (dużego przezroczystego pola) pozwoliło mi ustawić niestandardową klasę zgodnie z powyższym opisem.

Michael Stern
źródło
2

Miałem ten sam problem, ale potrzebne było inne rozwiązanie. Problem w tym przypadku polegał na tym, że klasa właściciela pliku nie była podłączona do pliku xib.

użytkownik1951454
źródło
2

Dzisiaj spotkałem coś bardzo podobnego z podklasą Swift UIViewController. W tym przypadku żadna z powyższych poprawek nie działała, ale nieco zmieniła się kolejność zmian w moim kodzie. Net-net z rozszerzeniem do podklasy występuje, zanim sama definicja podklasy w tym samym pliku wydaje się mylić XCode, pomimo kompilacji w porządku; poprawką było umieszczenie rozszerzeń po definicji podklasy.

Opublikowałem szczegóły w odpowiedzi na to podobne pytanie .

Cora Middleton
źródło
2

W moim przypadku wyznaczony inicjator - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilw klasie *** ViewController został zaimplementowany, więc nawet jeśli wywołam inny inicjator w celu zainicjowania obiektu, zostanie on wywołany.

Aby rozwiązać ten problem, sprawdź czy - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNiljest to również właściwy sposób.

lynulzy
źródło
2

Natknąłem się na ten problem w nieco inny sposób niż inne odpowiedzi tutaj.

Jeśli po prostu utworzyłem nowy plik xib, dodałem do niego UIViewController w Konstruktorze interfejsów i ustawiłem tę niestandardową klasę UIViewController na moim kontrolerze widoku, co spowodowało awarię „widok ujścia nie został ustawiony”. Inne rozwiązania mówią o przeciągnięciu kontrolnego ujścia widoku do Widoku, ale dla mnie ujście widoku było wyszarzone i nie mogłem go przeciągnąć.

wyszarzony widok gniazdka

Doszedłem do wniosku, że mój błąd polegał na dodaniu UIViewController w Interface Builder. Zamiast tego musiałem dodać UIView i ustawić niestandardową klasę właściciela pliku na mój kontroler widoku. Następnie mogłem przeciągnąć kontrolnie ujście właściciela pliku do nowego widoku UIView i wszystko działało tak, jak powinno.

Brian Kendig
źródło
1

Właśnie miałem ten sam błąd w moim projekcie, ale z innego powodu. W moim przypadku miałem konfigurację IBOutlet o nazwie „Widok” w mojej niestandardowej klasie UITableViewController. Wiedziałem, że „widok” był wyjątkowy, ponieważ należy on do klasy podstawowej, ale nie sądziłem, że widok (inny przypadek) również stanowiłby problem. Wydaje mi się, że w niektórych obszarach Kakao nie jest rozróżniana wielkość liter i prawdopodobnie ładowanie xib jest jednym z tych obszarów. Właśnie zmieniłem nazwę na DefaultView i teraz wszystko jest w porządku.

eselk
źródło
1

wybierz właściciela plików i otwórz inspektora tożsamości, podając nazwę klasy, której dotyczy. Jeśli żadna z powyższych metod nie działa, a nadal nie widzisz ujścia widoku, podaj nowy odnośnik ujścia Połączenie z Właścicielem pliku, możesz zobaczyć ujście widoku. Kliknij widok Outlet, aby nawiązać połączenie między View Outlet a właścicielem pliku. Uruchom aplikację, to działa dobrze.

Abhilash Reddy kallepu
źródło
1

W moim przypadku widok nie był wyświetlany w Xib. w xib Widok miał rozmiar = brak (4. karta po prawej stronie). Ustawiłem rozmiar na Freeform i ponownie załadowałem xCode. odwołano się od widoku i ustawiłem odpowiedni link do widoku.

OrdoDei
źródło
1

Jeśli po wypróbowaniu wszystkiego nadal występuje ten błąd, spróbuj ponownie utworzyć plik klasy od zera, ale pamiętaj, aby zaznaczyć pole wyboru „Utwórz także plik XIB”. Spowoduje to automatyczne połączenie kilku elementów, które nie są połączone podczas tworzenia tych plików osobno. Po utworzeniu tego możesz prawdopodobnie wyciąć i wkleić wszystko do nowego XIB i powinno działać dobrze.

Ten problem znajduje się w szczególności w przypadku tworzenia plików osobno w Swift.

Travis M.
źródło
1

dla mnie to się stało, kiedy

  • Mam klasę ViewController (.mm / h) powiązaną z plikiem Nib,
  • UIView z tego ViewController musi zostać załadowany do innego widoku jako widok podrzędny,

  • nazwiemy coś takiego

    -(void)initCheckView{
    
       CheckView *pCheckViewCtrl = [CheckView instance];
    
       pCheckView = [pCheckViewCtrl view];
    
       [[self view]addSubview:pCheckView];
    
       [pCheckViewCtrl performCheck];        
    
    }

Gdzie

+(CheckView *)instance{
    static CheckView *pCheckView = nil;
    static dispatch_once_t checkToken;

    dispatch_once(&checkToken, ^{
        pCheckView = [[CheckView alloc]initWithNibName:@"CheckView" bundle:nil];
        if ( pCheckView){
            [pCheckView initLocal];
            **[pCheckView loadView];**
        }
    });

    return pCheckView;

}

Tutaj brakowało loadView ,,, dodanie tego wiersza rozwiązało mój problem.

Amitg2k12
źródło
1

Miałem ten sam problem, zorientowałem się i to dlatego, że zaznaczyłem „ Komórki statyczne ” we właściwościach widoku tabeli w opcji Treść . Działa, gdy zmieni się na „ Dynamic Prototypes”. Zrzut ekranu znajduje się poniżej. wprowadź opis zdjęcia tutaj

Saranjith
źródło
1

Miałem podobny problem z Xcode 9.3 i naprawiłem to, ustawiając „Moduł” pod Inspektorem atrybutów „Właściciela pliku” dla modułu projektu.

nananta
źródło
1

Otwórz plik scenorysu , w którym istnieje twoja viewController, lub plik związany z XIB za pomocą textEdit.app i sprawdź, czy nazwa scenorysu lub nazwa XIB jest taka sama jak w viewController, a następnie zmień go, zapisz i ponownie załaduj / uruchom ponownie Xcode.

Alessandro Ornano
źródło
1

Jeśli używasz niestandardowej metody inicjowania, sprawdź, czy zwracasz coś ważnego. Natknąłem się na kod, który uderzył w coś takiego:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
   } return self;
}

W innej klasie kontroler został utworzony w następujący sposób:

CustomController *controller = [[CustomController alloc] init];

Problem polega na tym, że w metodzie init ja się nie zmieniło i powinno wyglądać następująco:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
      [controller viewDidLoad];
      self = controller;
   } return self;
}
Declan Land
źródło
0

Chciałbym wesprzeć Stephena J. Czasami X Code po prostu się myli. Po prostu miałem doświadczenie, w którym często bawiłem się interfejsem użytkownika i dodałem i usunąłem gniazda kilka razy. Gniazdka po prostu nie będą już połączone. Nigdy nie wymyśliłem konkretnego powodu (wypróbowałem wszystkie powyższe rozwiązania) i po prostu musiałem usunąć NIB i odtworzyć go od zera, a tak naprawdę musiałem użyć innej nazwy dla NIB, zanim zadziała. (XCode 4.6.1) Zmarnowałem na to kilka godzin.

BrianH
źródło