2014-05-05 41 views
5

Próbuję pchnąć ViewController programowo do kontrolera nawigacji, I używam mojego storyboard, aby go utworzyć.instantiateViewControllerWithIdentifier wydaje się wywoływać viewdidload

tutaj jest mój kod:

+ (void) pushViewController:(NSString *) identifier ForItems:(NSMutableArray *) items sender:(UIViewController *) sender { 
    GenericViewController *viewController = (GenericViewController *)[sender.storyboard instantiateViewControllerWithIdentifier:identifier]; 

    viewController.items = [[NSMutableArray alloc] init]; 
    [viewController.items removeAllObjects]; 
    [viewController.items addObject:[[NSMutableArray alloc] init]]; 
    [viewController.items[0] addObjectsFromArray:items]; 

    [sender.navigationController pushViewController:viewController animated:YES]; 
} 

W GenericViewController viewDidLoad Używam items. Dzięki niektórym punktom przełomowym widziałem, że GenericViewController viewDidLoad tuż po instantiateViewControllerWithIdentifier z items równe zeru.

Myślałem, że MyViewController viewDidLoad jest wywoływana podczas metody pushViewController.

Każdy pomysł, dlaczego viewDidLoad jest wywoływana podczas instantiateViewControllerWithIdentifier?

--- Aktualizacja ---

Oto moja viewDidLoad

- (void)viewDidLoad 
{ 
    for (MyItem *currentItem in self.items[0]) { 
     [Do Something] 
    } 

    [super viewDidLoad]; 


    [...] 
} 

self.items jest zerowa. więc nic nie jest zrobione.

+0

umieścić kompletny kod please..what jest myItem i viewDidLoad method..the problem nie jest this..cause podczas inicjowania obiektu, jest żywa. –

+0

Musisz podać więcej informacji.Pokaż całą metodę, w której używasz obiektu instantiateViewControllerWithIdentifier :. Metoda, instantiateViewControllerWithIdentifier :, nie spowoduje wywołania metody viewDidLoad, więc dzieje się coś innego. – rdelmar

+0

dziękuję @rdelmar Jestem prawie pewien, że 'instantiateViewControllerWithIdentifier' nie wywołuje' viewDidLoad'. Aktualizuję swój kod, używam statycznego menedżera, aby zainicjować i wypchnąć mój nowy viewController –

Odpowiedz

1

Patrz: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/viewDidLoad

viewDidLoad jest wywoływana, gdy widok kontrolera jest ładowany do pamięci.

Powiadamia kontroler widoku, że jego widok ma zostać dodany do hierarchii widoków. Myślę, że to jest, gdy jest wywoływana [self.navigationController pushViewController:viewController animated:YES];.

viewDidAppear Powiadamia kontrolera widoku, że jego widok został dodany do hierarchii widoków. To jest, gdy MyViewController jest dodawany do navigationController.

+0

ma sens, ale pytania SO wskazują, że jest to dobry sposób przekazywania właściwości do kontrolera widoku. (http://stackoverflow.com/a/9666389/1436861, http://stackoverflow.com/a/12709167/1436861) –

0

Jak wspomniano w voyage11, viewDidLoad jest wywoływane, gdy widok kontrolera jest ładowany do pamięci, chociaż ktoś zwrócił uwagę, że nie musi to nastąpić podczas metody instantiateViewControllerWithIdentifier.

Po swoim przykładzie kodu, chciałbym umieścić pętli w metodzie viewWillAppear:

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; // good practice to call the super 
    for (MyItem *currentItem in self.items[0]) { 
     [Do Something] 
    } 
} 
+0

Początkowa instrukcja jest niepoprawna - viewDidLoad nie zostanie wywołany tylko przez utworzenie instancji kontrolera widoku. – rdelmar

+0

Dobra uwaga. Zaktualizowałem swoją odpowiedź, aby usunąć tę implikację. –

4

każdemu, kto może nadal mają ten sam problem.

Miałem podobną sytuację i rozwiązałem ją, wywołując metodę loadViewIfNeeded().

let sb: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
let controller = sb.instantiateViewControllerWithIdentifier("LoadingView") as! LoadingViewController 
controller.loadViewIfNeeded() 

Mogłem wtedy uzyskać dostęp do wszystkiego w widoku.

+0

Zgodnie z dokumentacją, metoda loadView() nigdy nie powinna być wywoływana bezpośrednio. https://developer.apple.com/reference/uikit/uiviewcontroller/1621454-loadview – Ramiro

0

Można spróbować użyć "[self loadViewIfNeeded]" dla obj-c lub "self.loadViewIfNeeded()" do szybkiego; „Ja” = Twój ViewController

apple: loadViewIfNeeded