addChildViewController與viewWillAppear、viewDidAppear關係說明
最近專案中使用addChildViewController時遇到了很詭異的問題,我們的用法如下,在ParentViewController的viewWillAppear中請求資料,請求資料成功之後使用如下程式碼新增子檢視控制器:
[self.view addSubview:childViewController.view];
[self addChildViewController:childViewController];
這時會發生一個奇怪的現象,即childViewController的viewWillAppear方法會呼叫一次,viewDidAppear方法會連續呼叫兩次。當我們把新增子檢視控制器的程式碼改為以下程式碼時:
[self addChildViewController:childViewController]; [self.view addSubview:childViewController.view];
這時也會發生一個奇怪的現象,即childViewController的viewWillAppear方法不會呼叫,viewDidAppear方法會呼叫一次。
經過一番研究之後,終於找到了原因。當childViewController沒有被加到任何父檢視控制器時,如果把childViewController的view加到別的檢視上,viewWillAppear和viewDidAppear會正常呼叫。但是當childViewController被加到一個父檢視控制器上後,viewWillAppear和viewDidAppear就會與父檢視控制器的viewWillAppear和viewDidAppear事件同步。
所以在以上程式碼中第一種情況下,先呼叫addSubView,viewWillAppear和viewDidAppear會各呼叫一次,再addChildViewController,與父檢視控制器的事件同步,即當父檢視控制器的viewDidAppear呼叫時,childViewController的viewDidAppear方法會再呼叫一次。所以viewDidAppear方法被呼叫了兩次。
而在第二種情況下,先呼叫addChildViewController,childViewController的事件與父檢視控制器同步,當父檢視控制器的viewDidAppear呼叫時,childViewController的viewDidAppear方法會呼叫一次,再呼叫addSubView也不會觸發viewWillAppear和viewDidAppear。
因此,解決以上問題的辦法很簡單,將請求資料的程式碼放到viewDidAppear中即可。