2016-04-25 161 views
1

我有一個ContainerVC其中包含變量controllerToLoad。默認情況下它是「MainVC」,但是當點擊一個菜單項時,我想提出ContainerVC,而不是加載MainVC,我希望加載SecondVC。 我做加載MainVC我ContainerVC的viewDidLoad方法如下:viewDidLoad()在prepareForSegue()之前調用完成:Swift

if let controller = self.storyboard?.instantiateViewControllerWithIdentifier(controllerToLoad) { 
    self.mainViewController = controller 
} 

我認爲這樣做是賽格瑞的最好辦法,所以我把下面的代碼行:

self.performSegueWithIdentifier("MenuSegue", sender: self) 

然後在我prepareForSegue我做到以下幾點:

if (segue.identifier == "MenuSegue"){ 
    let secondViewController = segue.destinationViewController as! ContainerViewController 
    secondViewController.controllerToLoad = "SecondVC" 
} 

出於某種原因,稱performSegueWithIdentifier時自動加載ContainerVC並開始將self.mainViewController設置爲「MainVC」而不是等待prepareForSegue運行。我不知道爲什麼它不等待prepareForSegue完成。

我通過添加一堆打印語句來測試這個。在self.performSegueWithIdentifier之前和secondViewController.controllerToLoad = "SecondVC"之前以及我的ContainerVCViewDidLoad之前。添加打印語句後,我意識到,其實只要performSegueWithIdentifier被調用時,它調用之後的ContainerVCViewDidLoad然後執行

let secondViewController = segue.destinationViewController as! ContainerViewController secondViewController.controllerToLoad = "SecondVC"

回答

1

這是正確的和被預期的行爲。在prepareForSegue中,您可以訪問destinationViewController及其屬性,包括UIView元素,因此在邏輯上視圖必須已經加載。因此,viewDidLoad將被調用。

您可以使用另一種方法,如viewWillAppear,它在prepareForSegue之後執行,但看起來不同的方法會更好。也許你的容器視圖控制器上的一個方法告訴它加載並呈現一個新的VC。

+0

是的,你是對的。我把我的ContainerVC代碼放到一個方法中,它將self.mainViewController設置爲我傳遞的變量。偉大的提示! –

0

我想,你不需要做這兩件事。你實例化mainController,但是當你perfromSegue MainSegue有第二個mainController實例被創建,並且你有錯誤的視圖生命週期事件方法調用序列。您必須通過pushViewController推送mainController:animated或根本不創建它。

相關問題