是否可以以编程方式创建轻松的搜寻?

时间:2019-05-23 17:15:10

标签: ios swift uistoryboardsegue

我的应用程序有一个导航控制器,其中第一个视图控制器是一个登录屏幕,所有其他屏幕都被推到顶部。

每当对后端的任何HTTP请求返回401错误时,我都希望退回到登录屏幕。

我想到的是使用类似这样的东西向ViewController类添加扩展:

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

该segue是放松的segue。然后,每当请求失败时,我都会调用视图控制器的unwindToLoginScreen方法。

但是,这种方法的问题在于,我必须记住要为添加到项目中的所有新视图控制器在情节提要上创建所述展开序列。

到目前为止,我认为理想的计划是能够以编程方式而不是使用情节提要来创建展开序列。因此,默认情况下,我的unwindToLoginScreen()扩展方法可以在任何新的视图控制器中使用。像这样:

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

有可能做这样的事情吗?

1 个答案:

答案 0 :(得分:5)

您无法在代码中创建标记,但可以弹出到UINavigationController堆栈的根目录:

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

如果要弹出到不是根目录的viewController,可以在UINavigationController管理的viewController数组中找到它,然后调用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)
}