Swift - Как отклонить все контроллеры представлений, чтобы вернуться к корню

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

Итак, я хочу создать функцию для отклонения всех контроллеров представления, независимо от того, нажата ли она в навигационных контроллерах или представлена ​​модально или открыта какие-либо методы.

Я пробовал разные способы, но я, конечно, не смог убрать все контроллеры. Есть ли простой способ?

Ответ 1

Попробуйте следующее:

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

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

Если это не работает, вы можете сделать это вручную, выполнив цикл while таким образом.

func dismissViewControllers() {

    guard let vc = self.presentingViewController else { return }

    while (vc.presentingViewController != nil) {
        vc.dismiss(animated: true, completion: nil)
    }
}

Он отклонит все viewControllers до тех пор, пока у него не появится presentingController.

Изменить:, если вы хотите отклонить/поместить нажатые ViewControllers, вы можете использовать

self.navigationController?.popToRootViewController(animated: true)

Надеюсь, что это поможет.

Ответ 2

Если вы используете навигацию, вы можете использовать первый или, если вы представляете модально, вы можете использовать второй:

Для навигации

self.navigationController?.popToRootViewController(animated: true)

Для представления модально

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

Ответ 3

Просто попросите rootViewController отклонить любой ViewController, если вы представляете.

if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
   appDelegate.window?.rootViewController?.dismiss(animated: true, completion: nil)
   (appDelegate.window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: true)
}

Ответ 4

Привет всем, вот ответ для Swift-4.

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

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

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

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

Ответ 5

Используйте этот код для отклонения представленных viewcontrollers и перехода к навигации rootviewcontroller swift 4

// MARK:- Dismiss and Pop ViewControllers
func dismissPopAllViewViewControllers() {
    if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
        appDelegate.window?.rootViewController?.dismiss(animated: true, completion: nil)
        (appDelegate.window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: true)
    }
}

Ответ 6

 func  dismiss_all(view: UIView){
   view.window!.rootViewController?.dismiss(animated: true, completion: nil)

 }

Ответ 7

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

func popToRootViewController(animated: Bool)

Но если вы хотите перейти к конкретному контроллеру, просто используйте приведенную ниже функцию.

func popToViewController(UIViewController, animated: Bool)

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

Ответ 8

Создайте раздел "Размотка" (его можно найти по адресу https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/UsingSegues.html авторские права Apple Inc.)

Размотка сегментов позволяет вам отказаться от представленных контроллеров представления. Вы создаете раскручивающиеся сегменты в Интерфейсном Разработчике, связывая кнопку или другой подходящий объект с объектом Exit текущего контроллера представления. Когда пользователь нажимает кнопку или взаимодействует с соответствующим объектом, UIKit ищет в иерархии контроллера представления объект, способный обрабатывать последовательность откручивания. Затем он отклоняет текущий контроллер представления и любые промежуточные контроллеры представления, чтобы выявить цель развернутого перехода.

Создать раскручивающийся переход

  1. Выберите контроллер представления, который должен появиться на экране в конце развернутого перехода.

  2. Определите метод действия по размотке на выбранном контроллере вида.

Синтаксис Swift для этого метода выглядит следующим образом:

@IBAction func myUnwindAction(unwindSegue: UIStoryboardSegue)

Синтаксис Objective C для этого метода выглядит следующим образом:

- (IBAction)myUnwindAction:(UIStoryboardSegue*)unwindSegue

3. Перейдите к контроллеру представления, который инициирует действие раскручивания.

  1. Удерживая нажатой клавишу "Control", нажмите кнопку (или другой объект), которая должна инициировать переход. Этот элемент должен быть в контроллере представления, который вы хотите удалить.

  2. Перетащите к объекту Exit вверху сцены контроллера вида.

https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/Art/segue_unwind_linking_2x.png

  1. Выберите способ действия для размотки на панели отношений.

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

Ответ 9

Чтобы добиться того, чего вы хотите, измените свой стек навигации, затем сделайте popViewController.

let allControllers = NSMutableArray(array: navigationController!.viewControllers)
let vcCount = allControllers.count
for _ in 0 ..< vcCount - 2 {
    allControllers.removeObject(at: 1)
}
// now, allControllers[0] is root VC, allControllers[1] is presently displayed VC. write back to nav stack
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
// then pop root VC
navigationController!.popViewController(animated: true)

См. этот для дальнейшего управления стеком навигации. Если ваш самый верхний VC является модальным, сначала отпустите его перед кодом выше.

Ответ 10

Может быть, то, что вы ищете, раскрутить Segue.

Размотка сегментов дает вам возможность "раскрутить" стек навигации обратно через сегменты push, modeal, popover и другие типы сегментов. Вы используете раскручивающиеся сегменты, чтобы "вернуться" на один или несколько шагов в иерархии навигации.

Ссылка на документацию: https://developer.apple.com/library/archive/technotes/tn2298/_index.html

Ответ 12

Вы можете использовать этот фрагмент кода, чтобы настроить viewcontrolller на rootViewController.

let destination = HomeVC()
let appDelegate:UIApplicationDelegate = UIApplication.shared.delegate!
let initialViewController = destination
let navigationController = UINavigationController(rootViewController: initialViewController)
appDelegate.window??.rootViewController = navigationController
appDelegate.window??.makeKeyAndVisible()