我的印象是viewDidLoad將在prepareForSegue完成後調用。甚至Hegarty如何教他的斯坦福大學課程(最近在2013年2月)。viewDidLoad在prepareForSegue完成之前調用
但是,今天第一次,我注意到viewDidLoad被稱爲之前prepareForSegue完成。因此,我在prepareForSegue中設置的屬性對目標viewDidLoad方法內的destinationViewController不可用。
這似乎與預期的行爲相反。
UPDATE
我只是想出了事情的原委。在我destinationViewController我有一個自定義的制定者,將每一個「模式」被更新時重新加載的tableView:
DestinationViewController
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
[self.tableView reloadData];
}
原來,由於destinationViewController是的UITableViewController的子類......叫「self.tableView」強制視圖加載。根據Apple的文檔,調用視圖控制器的視圖屬性可以強制視圖加載。 UITableViewController的視圖是tableView。
因此,在prepareForSegue下面一行是迫使destinationViewController的視圖加載:
vc.managedObjectsArray = <custom method that returns an array>;
要解決這個問題,我改變了destinationViewController模型的定製的setter到:
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
if ([self isViewLoaded]) {
[self.tableView reloadData];
}
}
如果tableView在屏幕上,這將只會重新加載tableView。因此不要在prepareForSegue時強制加載視圖。
如果有人反對這個過程,請分享您的想法。否則,我希望這可以防止一個人長時間不眠之夜。
你怎麼知道viewDidLoad被調用?你能分享一些代碼嗎? – Spectravideo328 2013-02-28 23:24:38
我懷疑'prepareForSegue'實際上是(直接或間接)調用'viewDidLoad'的函數。 – 2013-02-28 23:26:00