Регулятор pop to root view из модального

Я пытаюсь запустить контроллер корневого представления с помощью следующего кода:

self.navigationController!.popToRootViewController(animated: true)

Это обычно работает, но я получаю сообщение об ошибке при попытке использовать этот код, когда текущий вид является модальным. Как я могу вернуться в контроллер корневого представления в этой ситуации?

Спасибо заранее.

Ответ 1

Вы можете проверить, что текущий контроллер представлен, если он представлен, затем отпустите его и перейдите к rootViewController другому мудрите, перейдя непосредственно к rootViewController

if self.presentingViewController != nil {
    self.dismiss(animated: false, completion: { 
       self.navigationController!.popToRootViewController(animated: true)
    })
}
else {
    self.navigationController!.popToRootViewController(animated: true)
}

Ответ 2

Результат:

Код

Предположим, что ваш Modal View имеет связанный ниже ViewController.

В основном, чтобы скрыть ваш вид, который отображается как Модальный, вы используете метод dismiss(animated: Bool) из вашего экземпляра ViewController.

И для представлений, представленных как Pushed, вы можете использовать из вашего свойства navigationController эти методы, например: popToRootViewController(animated: Bool), popViewController(animated:Bool)

class ModalViewController: UIViewController {

  @IBAction func backButtonTouched(_ sender: AnyObject) {
    let navigationController = self.presentingViewController as? UINavigationController

    self.dismiss(animated: true) {
      let _ = navigationController?.popToRootViewController(animated: true)
    }
  }

}

Ответ 3

Вы представили ViewController, поэтому вам нужно отклонить его.

Чтобы отключить ViewController в Swift, используйте это:

self.dismiss(animated: true, completion: nil)

Ответ 4

Вы можете сделать что-то вроде этого:

Objective-C:

[(UINavigationController *)self.presentingViewController popToRootViewControllerAnimated:NO];

[self dismissViewControllerAnimated:YES completion:nil];

Проверьте ответ здесь для справки:

ios: как отклонить контроллер модального представления, а затем вытащить толкаемый контроллер просмотра

Ответ 5

Как насчет уведомления об использовании?

ваше сообщение об ошибке только мода сообщение

и затем ваш навигационный контроллер, поп в rootViewController

Ответ 6

Если вы не хотите, чтобы анимация происходила, то есть вы хотите, чтобы пользователь видел контроллер корневого представления после отклонения модального представления:

CATransaction.begin()
CATransaction.setCompletionBlock {
    self.dismiss(animated: true, completion: nil)
}
self.navigationController?.popViewController(animated: false)
CATransaction.commit()

Справка от: Блок завершения для popViewController

Выше будет работать для выталкивания одного контроллера представления. Если вам нужно выскочить несколько, popToRootViewController не будет работать (несбалансированный вызов из-за анимации).

В этом случае используйте следующий (ручной) метод для их удаления:

guard let navigationController = self.navigationController else { return }
var navigationViewControllers = navigationController.viewControllers
navigationViewControllers.removeLast(navigationViewControllers.count - 1)
self.navigationController?.viewControllers = navigationViewControllers