Подтвердить что ты не робот

Единственная функция, чтобы отклонить все контроллеры открытого вида

У меня есть приложение, которое представляет собой приложение с одним представлением. У меня есть контроллер навигации, связанный со всеми дочерними контроллерами от контроллера корневого представления.

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

Мой основной старт:

func tryLogout(){
     self.dismissViewControllerAnimated(true, completion: nil)
     let navigationController = UINavigationController(rootViewController: UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("LoginViewController") )
     self.presentViewController(navigationController, animated: true, completion: nil)
}

Я ищу наиболее эффективный способ решения этой задачи. Я положу свою функцию выхода из системы в отдельный файл utils, но тогда я не могу использовать self. И у меня все еще есть проблема, чтобы узнать, какие контроллеры должны динамически отклоняться.

Обновление Было предложено использовать контроллер для просмотра в корневом режиме. Поэтому моя попытка:

func tryLogout(ViewController : UIViewController){
     print("do something")
     dispatch_async(dispatch_get_main_queue(), {
         ViewController.navigationController?.popToRootViewControllerAnimated(true)
         return
     })
 }

Будет ли это лучшим способом добиться того, что мне нужно?

4b9b3361

Ответ 1

Вы можете позвонить:

self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)

Следует отклонить все контроллеры представлений над контроллером корневого представления.

Ответ 2

Swift3

navigationController?.popToRootViewControllerAnimated(true)

Ответ 3

Обновленный ответ для Swift 3.2

self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)

Ответ 4

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

Здесь очень хороший ответ (с помощью smilebot), который показывает, как использовать разматывать segues для решения вашей проблемы fooobar.com/questions/25955/...

Ответ 5

работает для Swift 3.0 +

self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)