2016-11-13 2 views
0

В моем приложении я создал новую раскадровку, которая служит очень простым руководством по использованию определенных функций. (Instructions.storyboard). Эта раскадровка имеет свой собственный класс - InstructionsVC.swiftИспользование viewDidAppear для представления контроллера просмотра, повторного открытия его, когда он закрыт

Я хочу представить инструкцию VC, когда MainVC загружается в viewDidAppear.

Он отлично работает. Восстанавливает нагрузку на приложение, как и предполагалось. Проблема возникает, когда я нажимаю кнопку [Close] на интерфейсе инструкций. Он закрывает VC, исчезает на главном экране, а затем сразу же запускает команду VC.

Как я могу не допустить, чтобы инструкции VC загрузились после закрытия?

func openInstructions() { 
    let storyboard = UIStoryboard(name: "Instructions", bundle: nil) 
    let instructionsView = storyboard.instantiateViewController(withIdentifier: "instructionsStoryboardID") 
    instructionsView.modalPresentationStyle = .fullScreen 
    instructionsView.modalTransitionStyle = .crossDissolve 
    self.present(instructionsView, animated: true, completion:nil) 
} 

override func viewDidAppear(_ animated: Bool) { 
    openInstructions() 
} 

И в моем классе инструкции, у меня есть следующие действия на кнопку закрытия:

@IBAction func closeButtonPressed(_ sender: UIButton) { 
    let presentingViewController: UIViewController! = self.presentingViewController 
    presentingViewController.dismiss(animated: true, completion: nil) 
} 

Примечание - Я предпочел бы не использовать UserDefaults, чтобы решить эту проблему, потому что я собираюсь включите что-то подобное в другие части приложения и не хотите прибегать к UserDefaults для достижения желаемого поведения.

Спасибо заранее, друзья!

ответ

2

viewWillAppear и viewDidAppear вызывается каждый раз, когда вид содержимого контроллера просмотра становится видимым. Это включает в себя первый раз, когда он отображается, и когда он снова отображается после того, как он покрыт модальным или другим контроллером представления, толкаемым поверх него в стеке навигации.

viewDidLoad вызывается только один раз, когда содержимое содержимого контроллера просмотра было загружено, но перед его отображением. Таким образом, когда вызывается viewDidLoad, может быть слишком рано вызывать ваш второй контроллер просмотра.

Возможно, вы захотите добавить переменную экземпляра hasBeenDisplayed к вашему контроллеру. В viewDidAppear, проверьте hasBeenDisplayed. Если это неверно, отобразите ваш второй контроллер просмотра и установите значение hasBeenDisplayed в значение true.

+0

Спасибо! Это решение отлично работает. – Joe

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