2013-05-31 35 views
4

viewController的視圖在該viewController被推入導航控制器後不會被加載。視圖控制器被推入導航控制器後,viewDidLoad(和loadView)未被觸發。

這是我的代碼片段。

- (void)myMethodInClassA { 
    // window's root view controller is navigation controller 
    UINavigationController *naviCtrl = (UINavigationController*)[UIApplication sharedApplication].keyWindow.rootViewController; 
    MyViewController *myVC = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
    [naviCtrl pushViewController:myVC animated:NO]; 

    // at this point, myVC's view is NOT loaded 
} 

當我打電話myMethodInClassA,myVC的viewDidLoad被稱爲該方法返回後。我希望myVC的視圖在導航控制器的pushViewController:animated:被調用之後並且在myMethodInClassA返回之前加載。

何時加載完成視圖控制器的視圖? Apple的文檔只是說它在第一次訪問時被加載。這有點模糊。爲什麼導航控制器的pushViewController:訪問視圖控制器的視圖?

p.s.抱歉,最初的含糊問題。

+1

顯示你的代碼。 – rdelmar

+0

我不知道你在問什麼。對我來說完全是無稽之談。 – HalR

+0

你可以請你展示你的代碼,你如何推入導航控制器? –

回答

0

如果那個ViewController已經被導入到navigationController棧中,那麼ViewDidLoad方法將不會被再次調用。 第一次您將推動該ViewController然後viewDidLoad將被調用。 所以如果你需要每次都執行你的一些功能,那麼在viewWillAppear方法中實現它,因爲每次你推送你的viewController時都會調用它。

希望它可以幫助你。

0

你是否推動視圖控制器的第一個tym?如果是,那麼只有viewDidLoad()控制器將被調用,如果它已經推動,這不是第一個tyn那麼viewWillAppear()將被調用。 )如果你正在製作一個新的實例,每一個tym你推它,然後viewDidLoad()將被調用。

1

如上所述,viewDidLoad中被調用一次,當一個視圖推,你可能想要做你的東西在viewWillAppear中或viewDidAppear。

8

推的圖控制器(VC)到導航控制器的堆棧使VC到導航控制器的子視圖控制器(它是一個容器視圖控制器)。創建這樣的孩子 - 父母關係是一個獨特的步驟,不會導致孩子VC的視圖被立即加載。容器VC稍後加載視圖。我相信沒有關於「後來」意味着什麼的明確說明 - 通常是容器VC決定將兒童VC的視圖集成到容器VC的視圖層次結構中的時候。但基本上它只是由容器VC的實施決定。

也就是說,任何人都可以強制通過訪問VC的view屬性加載VC的視圖。例如,在你的代碼,你可以加入這一行

myVC.view; 

可能會觸發loadView,然後在MyViewControllerviewDidLoad

然而,在你的情況下,如果MyViewController需要對它已經與容器VC相關聯的事件作出反應,那麼覆蓋一個(或兩者都會更好?)在MyViewController以下方法:

- (void) willMoveToParentViewController:(UIViewController*)parent 
{ 
    // write your code here 
} 

- (void) didMoveToParentViewController:(UIViewController*)parent 
{ 
    // write your code here 
} 

你需要注意,雖然,willMoveToParentViewControllerdidMoveToParentViewControllerMyViewController從其父導航器的彈出堆棧也被調用。您可以通過檢查nil的參數parent來檢測到這種情況。

+1

我已經通過調用'[myVC view]'做了解決方法。但我不知道爲什麼它沒有立即加載。你的回答對理解很有幫助,並且你重寫'didMoveTo ...'的建議似乎比調用'[myVC view]'更好。謝謝。 – minorblend

+0

@JoshChung很高興能幫到你。我在關於'didMoveToParentViewController:'在彈出子VC時被調用的回答中添加了另一段。 – herzbube

1

(斯威夫特2) 因爲這個問題沒有一個公認的答案...

我落得這樣做是創建在子視圖控制器初始化方便:

convenience init() { 
    self.init(nibName: "ChildViewController", bundle: nil) 
    //initializing the view Controller form specified NIB file 
} 

和在parentViewController的viewDidLoad中()

let commentsView = CommentsViewController() 
self.addChildViewController(commentsView) 
self.momentsScrollView.addSubview(commentsView.view) 
commentsView.didMoveToParentViewController(self) 
相關問題