Можно ли создавать раскручивающиеся сегменты программно? - PullRequest
0 голосов
/ 23 мая 2019

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

Я бы хотел вернуться к экрану входа в систему, когда любой http-запрос к бэкэнду возвращает ошибку 401.

Я хотел добавить расширение к классу ViewController примерно так:

extension UIViewController {
    func unwindToLoginScreen() {
        performSegue(withIdentifier: loginScreen)
    }
}

И это было бы разве что. Затем, когда запрос не выполняется, я вызываю метод контроллера вида unwindToLoginScreen.

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

До сих пор я думаю, что идеальным планом было бы иметь возможность создавать программу раскрутки программно, а не использовать раскадровку. Таким образом, мой метод расширения unwindToLoginScreen() будет работать в любом новом контроллере представления по умолчанию. Что-то вроде:

extension UIViewController {
    func unwindToLoginScreen() {
        let segue = UnwindSegue(identifier: "blablah", segue: LoginViewController.unwindToLoginViewController)
        segue.perform()
    }
}

Можно ли сделать что-то подобное?

1 Ответ

5 голосов
/ 23 мая 2019

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

func returnToLoginScreen() {
    self.navigationController?.popToRootViewController(animated: true)
}

Если вы хотите получить доступ к viewController, который не является корневым, вы можете найти его в массиве viewController, управляемом UINavigationController, а затем вызвать popToViewController:

// pop to second viewController in the stack
self.navigationController?.popToViewController(self.navigationController!.viewControllers[1], animated: true)

... или найдите ViewController по типу:

if let loginVC = self.navigationController?.viewControllers.first(where: { $0 is LoginViewController }) {
    self.navigationController?.popToViewController(loginVC, animated: true)
}
...