2016-04-25 3 views
1

У меня есть ContainerVC, который содержит переменную controllerToLoad. По умолчанию это «MainVC», однако при нажатии на пункт меню я хочу представить ContainerVC, но вместо загрузки MainVC, я хочу загрузить SecondVC. я загружаю MainVC в методе ViewDidLoad моего ContainerVC, выполнив следующие действия:viewDidLoad() Получение вызова Перед подготовкой к отделу() Отделка: Swift

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

Я думал, что лучший способ сделать это с помощью Segue, поэтому я называю следующие строки кода:

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" и в ViewDidLoad моего ContainerVC. После добавления печати заявления я понял, что на самом деле, как только performSegueWithIdentifier называется, сразу после того, он вызывает ViewDidLoad из ContainerVC затем выполняет

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, и вы вызываете неправильную последовательность вызовов событий цикла событий. вы либо должны нажать mainController с помощью pushViewController: анимировать или вообще не создавать его.

Смежные вопросы