Уволить сразу два UIViewController без анимации - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть стек UIViewControllers типа A -> B -> C.Я хочу вернуться к контроллеру A из C. Я делаю это с кодом ниже:

DispatchQueue.global(qos: .background).sync {
// Background Thread
DispatchQueue.main.async {
    self.presentingViewController?.presentingViewController?.dismiss(animated: false, completion: {
    })}
}

Это работает, но контроллер B виден на экране, хотя я установил для animated значение false.Как я могу закрыть два UIViewController, не показывая средний (B)?

PS: я не могу просто удалить из корневого контроллера напрямую, а также не могу использовать UINavigationController

Я искал сообщество, но ничего не нашел в анимации.

Отклонить более одного контроллера вида одновременно

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я создал пример для снятия контроллера B перед показом контроллера C.Вы можете попробовать.

    let bController = ViewController()
    let cController = ViewController()

    aController.present(bController, animated: true) {

        DispatchQueue.main.asyncAfter(wallDeadline: .now()+2, execute: {

            let presentingVC = bController.presentingViewController

            bController.dismiss(animated: false, completion: {

                presentingVC?.present(cController, animated: true, completion: nil)

            })
        })

    }

Но, на мой взгляд, решение с использованием контроллера навигации будет лучшим для данного случая.Например, вы можете поместить только контроллер B в контроллер навигации -> представить navController на контроллере A -> затем показать C внутри navController -> затем удалить из контроллера C весь navController -> И вы снова увидите контроллер A.Подумайте и о решении.

Другое решение

Я проверил другое решение.Вот расширение, которое должно решить вашу проблему.

extension UIViewController {

    func dissmissViewController(toViewController: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
        self.dismiss(animated: flag, completion: completion)
        self.view.window?.insertSubview(toViewController.view, at: 0)
        dissmissAllPresentedControllers(from: toViewController)
        if toViewController.presentedViewController != self {
            toViewController.presentedViewController?.dismiss(animated: false, completion: nil)
        }
    }

    private func dissmissAllPresentedControllers(from rootController: UIViewController) {
        if let controller = rootController.presentedViewController, controller != self {
            controller.view.isHidden = true
            dissmissAllPresentedControllers(from: controller)
        }
    }

}

Использование

let rootController = self.presentingViewController!.presentingViewController! //Pointer to controller which should be shown after you dismiss current controller
self.dissmissViewController(toViewController: rootController, animated: true) 

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

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

0 голосов
/ 29 ноября 2018

Попробуйте это.

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

Создан пример раскадровки, подобный этому

enter image description here

Желтый контроллер вида имеет тип ViewController и действие кнопки выглядит следующим образом

@IBAction func Pressed(_ sender: Any) {
    self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)
}

Выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...