6

Mam problem z ustawieniem domyślnego widoku narzędzia View View w programie Interface Builder. Oto moja konfiguracja:UINavigationController NIB wymaga, aby właściciel pliku miał widok?

Mam aplikację opartą na umieszczenie zakładek gdzie załadować kontroler nawigacji jako modalny widoku ...

MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc]initWithNibName:@"MenuController" bundle:nil]; 
[tabBarController presentModalViewController:menu animated:anim]; 

sama MenuController ma następującą strukturę:

 
MenuController.xib 
    File's Owner (MyNavCtrlrSubClass : UIViewController) 
    Navigation Controller (UINavigationController) 
    Navigation Bar (UINavigationBar) 
    Root View Controller (Nib Name is set to load AnotherViewController.nib) 
     Navigation Item -> (UINavigationItem) 

to wszystko działa dobrze, z wyjątkiem tego, że po załadowaniu MyNavCtrlrSubClass pojawia się następujący błąd:

Loaded the "MenuController" nib but the view outlet was not set

Jest jasne, dlaczego tak się dzieje - Właściciel pliku nie ma połączenia z wylotem dla swojego widoku. Pytanie brzmi, co powinienem ustawić jako jego pogląd, i czy coś trzeba najpierw ustawić? Pasek nawigacyjny jest jedynym kandydatem w MenuController.xib, ale dzięki temu rozmiar samego UINavigationBar zostanie zmieniony na tryb pełnoekranowy.

Najwyraźniej brakuje mi czegoś w IB, ale co? MyNavCtrlrSubClass.m nie ma samego kodu, z wyjątkiem IBOutlet dla UINavigationController. Czy popełniam błąd, próbując ustawić to w całości w IB? Pomysł polega na zachowaniu modalnego kontrolera nawigacyjnego w jednym stalówce i wszystkich widokach ładowanych w oddzielnych stalówkach, ale ponieważ MenuController jest tylko pojemnikiem do nawigacji i nie zawiera żadnych widoków, oczywiście projektuję go źle. :)

Jeśli zastanawiasz się, dlaczego nie projektuję tego w inny sposób, to dlatego, że staram się być posłuszna mojemu (prawdopodobnie błędnie) postrzeganiu tego, w jaki sposób IB prosi Cię o zbudowanie idealnej hierarchii.

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

5

Myślę, że możesz nie rozumieć, w jaki sposób Właściciel pliku ma być używany w pliku NIB. Napisałem odpowiedź opisującą właściciela pliku under another question.

Po wywołaniu tej linii:

[[MyNavCtrlrSubClass alloc] initWithNibName:@"MenuController" bundle:nil] 

utworzyć instancję MyNavCtrlrSubClass i poinformować go, aby załadować @ "MenuController". Następnie w pliku MenuController.xib znajduje się drugi niespokrewniony kontroler UINavigationController z obiektami wewnątrz niego. Kiedy MenuController.nib zostanie załadowany w czasie wykonywania, zostanie utworzony drugi kontroler nawigacyjny.

Drugi problem polega na tym, że poinformowanie kontrolera UINavigationController o załadowaniu pliku NIB nie jest zbyt sensowne, ponieważ kontrolery nawigacyjne tworzą własne widoki i zarządzają nimi. Naprawdę chcesz utworzyć kontroler widoku root i nakazać kontrolerowi widoku załadowanie pliku NIB.

Spróbuj tego:

MyRootViewController *rootController = [[[MyRootViewController alloc] initWithNibName:@"AnotherViewController" bundle:nil] autorelease]; 
MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc] initWithRootViewController:rootController]; 

Gdzie twój XIB pliku wygląda następująco:

  • plik jest właściciel (klasy ustawiony MyRootViewController, widok wylot połączony z kolejnym UIView)
  • UIView
    • Wywiad A
    • podrzędny B

Po jesteś komfortowe z tym, jak to wszystko działa, można również rozważyć uruchamianiu tego widoku Kontroler nawigacyjny i korzeni w jednym pliku XIB jakbyś zaczynają zrobić w kodzie wysłałeś.

+0

Dzięki za informacyjną odpowiedź! Zaraz zobaczę, co mogę z tym zrobić, i wkrótce opublikuję. Na razie pozwól, że zapytam: jak załadowałbyś modalną stalówkę kontrolera nawigacji, projektując jak najwięcej w Konstruktorze interfejsów? Czy jest to konieczne, jak w twoim przykładzie, aby skonfigurować kontroler kontrolera widoku, a następnie programowo utworzyć kontroler nawigacyjny lub czy mogę zdefiniować hierarchię widoku tylko w IB? –

+0

UWAGA: wygląda na to, że tworzenie sterownika nawigacyjnego programowo oznacza, że ​​muszę również programowo ustawić hierarchię kontrolera widoku, a następnie oddalam się od IB, zaczynając od kontrolera nawigacyjnego w dół. –

+1

Możesz utworzyć kontroler nawigacyjny i kontroler widoku root w kodzie i załadować widok dla kontrolera widoku root w IB. To nie będzie niezręczne. Można również utworzyć kontroler nawigacyjny, a jest to kontroler widoku root w oddzielnym widoku XIB z widoku kontrolera widoku głównego. Ten oddzielny XIB to zazwyczaj plik MainWindow.xib. Po załadowaniu pliku MainWindow.xib zostaną utworzone dwa kontrolery widoku. Kiedy kontroler widoku root potrzebuje najpierw widoku, załaduje go z drugiego pliku XIB. To typowy sposób na zrobienie tego. –

0

W IB, w końcówce MenuController dodaj UIView i ustaw ten widok jako wylot. Będziesz musiał ustawić ten widok dla kontrolera UIViewController. Here to szybki link do strony Apple z podstawową konfiguracją. Nie jestem pewien, czy pomoże ci to na obecnym etapie.

+0

Problem polega na tym, że w mojej końcówce kontrolera nawigacji nie ma widoku do podpięcia. Ograniczenia polegają na tym, że chcę oddzielić poszczególne pojedyncze końcówki, więc mój problem jest zorientowany na koncepcję lub projekt, a nie na problem implementacji. Dzięki w każdym razie. –

+0

Jaki widok ustawiony jest dla elementu AnotherViewController? Wygląda na to, że to jest problem. – Jordan

+0

AnotherViewController jest po prostu kontrolerem widoku z pojedynczym widokiem. Ale nawet nie jest załadowany. Problem pojawia się gdzieś w cyklu życia, gdy MenuController chce widoku, ale zamiast tego, co miałem nadzieję, będzie automagicznie propagować żądanie w dół formantów, po prostu wyrzuca wyżej wymieniony błąd. Twoja odpowiedź brzmi, jakbyś sugerowała, że ​​właściciel pliku nie musi mieć stalówki. Czy to twoje zrozumienie? –

1

Sedno tego pytania potwierdza sam Travis: "Jak załadowałbyś stalówkę kontrolera nawigacji, projektując jak najwięcej w Konstruktorze interfejsów?" A także z przykładu wygląda na to, że oznacza to UINavigationController i powiązane kontrolery UIViewController.

Przy tej interpretacji odpowiedź brzmi, że nie można w pełni skonfigurować kontrolera UINavigationController i kontrolerów UIViewController w jednym XIB. Tak, intuicyjnie chcesz to zrobić, żebyś nie był szalony.

Kiedy mówię, że nie możesz tego zrobić, mam na myśli, że najczęściej używane metody ramowe nie mają sposobu, aby sobie z tym poradzić. Nie istnieje [UINavigationController alloc] initWithMegaNibName. Tak, możesz wrzucić prawie wszystko w jeden XIB i napisać kod, aby uwodnić obiekty w specjalny sposób, ale nie sądzę, że tego właśnie szukasz.

Można użyć dwóch lub więcej XIB, jak zasugerował Jon, ale wtedy rzeczy są mniej samodzielne i dlatego masz wielu ludzi, którzy uważają, że łatwiej jest zrobić część lub całość kontrolerów w kodzie.

Niestety nie ma zgodności 1: 1 między możliwościami tworzenia interfejsu a kodem, jak na innych platformach programistycznych. Generalnie wolę pozwalać projektantom uczestniczyć jak najwięcej w tworzeniu zasobów, ale większość z nich wiem, że nie koduję celu-c.