2013-09-25 10 views
7

Mam stalówkę z elementu głównego kontrolera widoku tak:Jak załadować XIB za pomocą ViewController najwyższego poziomu?

enter image description here

więc mogę umieścić elementy w stosunku do górnych i dolnych prowadnic układ z wykorzystaniem automatycznego układu.

Kiedy po raz pierwszy próbował załadować stalówkę korzystając

SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]]; 

mam następujący wyjątek czasu wykonywania:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "SearchViewControllerPro" nib but the view outlet was not set.'

googlowania błąd został wskazał mi, że właściciel pliku xib musi być ustawiony na klasę mojego kontrolera widoku, a wylot widoku musiał zostać ustawiony na obiekt widoku w Xib. Jeśli mam to zrobić, wtedy pojawia się następujący błąd czasu wykonywania:

Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View > is associated with . Clear this association before associating this view with .'

Nie dziwi ponieważ widok jest związany zarówno właściciela pliku i kontrolera widoku najwyższego poziomu stalówki. Ale w jaki sposób mogę powiedzieć biegiem czasu, że są one w rzeczywistości tym samym, a nie dwoma odrębnymi bytami?

Edit: Kiedy próbuję unpck się ViewController od stalówki jak tak,

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil]; 
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject]; 

, to jednak nie dobre albo:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.

rozwiązanie tymczasowe:

Znalazłem rozwiązanie, ale nie jest ładne. Pomimo struktury pokazanej w IB, kontroler widoku nie jest ostatnim obiektem w Xib. Tak więc mam:

__block SearchViewControllerPro* mapSearchViewController = nil; 
[xibContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([obj isKindOfClass:[SearchViewControllerPro class]]) { 
     mapSearchViewController = obj; 
    } 
}]; 

i wydaje się, że działa bez przestojów w czasie wykonywania. Jednak to wszystko, ale czysty kod.

+0

chodzi o edycję .. masz błędy w stalówkę. Musisz upewnić się, że nazwy klas są poprawne i musisz ręcznie rozłączyć wszystkie niepoprawne połączenia. Co ustawiłeś jako klasę FilesOwner? Jakie połączenia nawiązałeś do FilesOwner? – hooleyhoop

+0

OK, nie ma znaczenia, co ustawiłeś w klasie FilesOwner tak długo, jak zdajesz sobie sprawę, że to się zmieni w zależności od tego, czy robisz [NSBundle mainBundle] loadNibNamed: ... lub przydzielaj SearchViewControllerPro] initWithNibName: ... dlatego wszelkie połączenia z Tobą dokonane w FilesOwner będą nieważne (ulegniesz awarii), jeśli zmienisz metodę ładowania – hooleyhoop

Odpowiedz

4

how can I tell the run-time that they are both in fact the very same thing instead of two separate entities?

Nie możesz, ponieważ nie są one tym samym. Utworzono dwie instancje SearchViewControllerPro.

Musisz albo przydzielać -instaluj instancję SearchViewControllerPro, albo usunąć kopię archiwalną ze stalówki.

Jeśli zdecydujesz się utworzyć ViewController w końcówce, zwykły sposób dostępu do niego jest taki sam, jak dostęp do dowolnego innego elementu (widok, przycisk, pole tekstowe), który tworzysz w stalówce.

Dodaj gniazdko do obiektu FilesOwner, podłącz połączenie w programie budującym interfejs i pamiętaj, aby przekazać obiekt podczas rozpakowywania stalówki.

np Jeśli chcesz obiekt, który unarchives stalówkę być FilesOwner:

[[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:self options:nil]; 
+0

Dziękuję za odpowiedź. Nie jestem pewien, czy to rozumiem. Po prostu próbowałem pobrać 'ViewController'' z wnętrza nib, ale nie miałem szczęścia (zobacz moją edycję powyżej, czy to masz na myśli?). Na twój komentarz: Tak, wiem, że teraz mam dwie instancje. Chciałem powiedzieć, że chcę je rozdzielić na ten sam obiekt i nie wiem jak to zrobić w IB lub kodzie, ponieważ wywołanie inicjału się nie udaje (zobacz błędy powyżej). – Chris

+0

Co to znaczy "rozwiązać dwie instancje w tym samym obiekcie"? Jeśli to zrobię: ob1 = [init SearchInControllerPro] init]; ob2 = init [Przypisanie SearchViewControllerPro]; (i to jest to, co zrobiłeś) Jak mógłbym je rozwiązać w jednym wystąpieniu? Dwa obiekty to dwa obiekty. – hooleyhoop

+2

Pozwolę sobie przeformułować pytanie: Wiem, jak załadować stalówkę jako widok do 'UIViewController''. Ponieważ dla iOS7 potrzebuję zmienić położenie elementów względem topLayoutGuide, musiałem ustawić kontroler widoku jako element najwyższego poziomu w końcówce, a moje próby załadowania go do tej pory nie powiodły się. Poprawnie opisujesz symptomy - ze względu na strukturę stalówki i sposób, w jaki próbowałem utworzyć instancję kontrolera widoku, otrzymuję dwa obiekty. Ale nie wiem, jak skonfigurować końcówkę i wywołanie ładowania, aby uzyskać tylko jeden. Mam nadzieję, że to wyjaśni to lepiej. – Chris

3

następujących utworów, jak również i (przynajmniej dla mnie) jest nieco bardziej wyraźne, że stworzenie rynku zbytu dla ViewController:

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil]; 
SearchViewControllerPro* mapSearchViewController = [xibContents objectAtIndex:0]; 
0
if (isIPad) 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPad" owner:self 
options:nil]; 

} 
else{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPhone" owner:self options:nil]; 

} 
+0

Chociaż ten kod może pomóc rozwiązać problem, nie wyjaśnia on, dlaczego _why_ i/lub _how_ it odpowiada pytanie. Zapewnienie tego dodatkowego kontekstu znacznie poprawiłoby jego długoterminową wartość edukacyjną. Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienie, w tym, jakie ograniczenia i założenia mają zastosowanie. –