是否可以以编程方式创建放松趋势?

Fel*_*rri 0 ios uistoryboardsegue swift

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

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

我想到的是使用以下内容向ViewController类添加扩展:

extension UIViewController {
    func unwindToLoginScreen() {
        performSegue(withIdentifier: loginScreen)
    }
}
Run Code Online (Sandbox Code Playgroud)

这场比赛将是一场放松的比赛。然后,每当请求失败时,我都会调用视图控制器的unwindToLoginScreen方法。

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

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

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

有可能做这样的事情吗?

vac*_*ama 5

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

func returnToLoginScreen() {
    self.navigationController?.popToRootViewController(animated: true)
}
Run Code Online (Sandbox Code Playgroud)

如果要弹出到不是根目录的viewController,可以在由所管理的viewController的数组中找到它UINavigationController,然后调用popToViewController

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

...或ViewController按类型搜索:

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

  • 是的,您可以指定要弹出的控制器,例如:`self.navigationController?.popToViewController(self.navigationController!.viewControllers [1],animation:true)`。这将弹出堆栈中的第二个viewController。 (3认同)