У меня есть раскадровка, подобная этой:

Домашний навигационный контроллер - VC1 - VC2 - VC3 - VC4

Настройки Nav Controller - VC1 - VC2 - VC3

Для перехода между домашними экранами и экранами настроек у меня есть значок / кнопка «Домой» в настройках VC1; и значок / кнопка настроек в Home VC1. Но я не могу заставить этот переход работать правильно.

Сначала я попробовал этот код.

@IBAction func homeButtonTapped(button: UIButton) {
    var navController: AppStoryboard.Main.instance.instantiateViewController(withIdentifier: "HomeNavController") as? UINavigationController

    currentViewController?.present(navController!, animated: true, completion: nil)
}

//... similar code for settingsButtonTapped

Работает нормально. Но это создает несколько экземпляров контроллера представления (проверено графом отладочной памяти). Скажем, я перехожу между Home VC1 и Settings VC1 5 раз, я вижу 5 экземпляров каждого контроллера представления.

Тогда я попробовал это.

@IBAction func homeButtonTapped(button: UIButton) {
    var navController: AppStoryboard.Main.instance.instantiateViewController(withIdentifier: "HomeNavController") as? UINavigationController

    window?.rootViewController = navController!
}

//... similar code for settingsButtonTapped

Это решило проблему нескольких экземпляров. Но это портит пользовательские всплывающие окна анимации, которые у меня есть. Всплывающие окна работают нормально, если я никогда не нажимаю кнопку «Домой» или «Настройки». Но если я нажму кнопку один раз, с этого момента всплывающие окна будут отображаться неправильно. Скажем, я иду от VC1 до VC2, а затем открыть всплывающее окно в VC2. Появляется всплывающее окно, но фон не выделяется серым, как обычно, и я ясно вижу содержимое VC2, а за ним я также могу видеть содержимое VC1.

Любое предложение о том, как заставить это работать?

Спасибо.

0
SKT 12 Апр 2019 в 17:33

2 ответа

Лучший ответ

Вы должны объявить, какой из этих двух элементов виден первым, поэтому, если мы предположим, что Home является первым, который отображается пользователям, нажимая на настройки, вы должны представить его следующим образом.

@IBAction func settingsButtonTapped(button: UIButton) {
    let navController = // Instantiate your settings controller
    present(navController!, animated: true, completion: nil)
}

Затем, если вы хотите вернуться к контроллеру домашнего просмотра, вы должны удалить контроллер представления настроек следующим образом:

@IBAction func homeButtonTapped(button: UIButton) {
    presentingViewController?.dismiss(animated: true, completion: nil)
}

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

1
LorenzOliveto 21 Май 2019 в 10:07

Вы должны представить только один навигационный контроллер, и я думаю, что это должен быть SettingViewController

@IBAction func SettingButtonTapped(button: UIButton) {
    var navController: AppStoryboard.Main.instance.instantiateViewController(withIdentifier: "SettingNavController") as? UINavigationController

    currentViewController?.present(navController!, animated: true, completion: nil)
}

Но в homeButtonTapped вы должны просто уволить контроллер

@IBAction func homeButtonTapped(button: UIButton) {
   self.navigationController?.dismiss(animated: true, completion: nil)
}
0
Razi Tiwana 12 Апр 2019 в 14:40