標籤:
最近項目中使用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中即可。
如果大家覺得對自己有協助的話,還希望能幫頂一下,謝謝:)
個人部落格:http://blog.csdn.net/zhaoxy2850
本文地址:http://blog.csdn.net/zhaoxy_thu/article/details/50826190
轉載請註明出處,謝謝!
addChildViewController與viewWillAppear、viewDidAppear關係說明