2011-09-11 14 views
5

Chcę ustawić program UIViewController w programistycznie NavigationController, jednak metoda loadView lub viewDidLoad wywoływana.loadView z UIViewController nie nazywany

To jest mój kod w app delegata:

MyViewController *viewController = [[MyViewController alloc] init]; 
UIView *view = [[UIView alloc] initWithFrame:window.frame]; 
viewController.view = view; 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

Kiedy uruchomić aplikację widzę navigationbar, ale nie ma połączenia z loadview. czego mi brakuje? Myślałem loadview jest wywoływana po wywołaniu view

Edit

MyViewController *viewController = [[MyViewController alloc] init]; 
[viewController view]; // doesn't look right? 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

edytowany kierunku komentarzu Jonasza, ale loadview nadal nie zostanie wywołana.

Odpowiedz

10

UIViewController stworzy swój pogląd (poprzez załadowanie go ze stalówką lub wykonawczych -loadView), gdy regulator za view getter nazywa i jego pogląd jest obecnie nil.

W pokazanym kodzie nigdy nie wywołuje się gettera właściwości widoku, tylko jego ustawiacz.

Przypisuje również widok kontrolera z delegata aplikacji. Oczekuje się, że s. UIViewController utworzą własne poglądy na żądanie, ale nie będą dostępne w innych klasach. Takie podejście spowoduje problemy później, gdy zdasz sobie sprawę, że kontroler wyładowuje swój widok i próbuje go odtworzyć w odpowiedzi na ostrzeżenia o pamięci. Pozwól swojemu kontrolerowi stworzyć swój widok, nie próbuj go przekazać.

+0

Odnośnie drugiej uwagi, przypisanie widoku oznacza twoją drugą i trzecią linię kodu, prawda? To ma sens. Ale jak nazwałbym gettera w tym przypadku? –

+0

'[viewController view]' wywołuje getter widoku, ale nie powinno być potrzeby, aby to zrobić bezpośrednio. "UINavigationController", do którego dodałeś kontroler widoku, w pewnym momencie wywoła ten proces, aby dodać widok kontrolera do hierarchii widoku. Czy możesz udostępnić swoją implementację kontrolera widoku? Wygląda na to, że coś się dzieje. – Jonah

+0

Jest to po prostu pusty szablon UIViewController z Xcode, ale nie wywołuje metody (view) oprócz init. Tam próbowałem ustawić taki widok: - (id) init { \t self ((self = [super init])) { \t UIView * view = [[przydziela UIView] initWithFrame: [[UIScreen mainScreen] ograniczenia] ]; \t self.view = widok; \t [Wyświetl wersję]; \t} return self; } –

2

Być może nie napotkaliście tego problemu ... ale pewnego dnia wpadłem na ten sam irytujący problem .. loadView, viewDidLoad i viewWillAppear nie są wywoływane w moim UIViewController.

Mój problem był prosty, ale nieco trudny do złapania, jeśli nie jesteś bardzo ostrożny. Zamiast pisać

-(void) loadView 

pisałem:

-(void) loadview 

Należy pamiętać, że to nie zadziała żadnego ostrzeżenia. Różnica "V" i "v" w loadView może być łatwo pominięta. I oczywiście, ponieważ loadView nie został wywołany, viewDidLoad/viewWillAppear nie zostanie wywołany, ponieważ nie było widoku, który został załadowany (nie używam żadnego nib ... tworzenie widoku programowo).

-Anshu

2

Innym haczyka uwagę zasługuje jeśli zdefiniować

@synthesize view; 

bez @property dopasowującego w implementacji, może to doprowadzić do rozmów na powrót zera Państwa zdaniem regulatora, a nie wezwanie do swojej metody loadView.

+1

Aha! Ten mnie dopadł. Skończyło się na "widoku @synthesize" w klasie z powodu nadgorliwej operacji znajdowania/zamiany, nie zdawałem sobie z tego sprawy i nagle mój widok był zupełnie pusty, ponieważ loadView nigdy nie był już wywoływany. To było trudne do wyśledzenia. Dzięki! –

Powiązane problemy