ios - 是否可以通过编程方式创建 unwind segue?

标签 ios swift uistoryboardsegue

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

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

我的想法是向 ViewController 类添加一个扩展,如下所示:

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

并且 segue 将是一个 unwind segue。然后,每当请求失败时,我都会调用 View Controller 的 unwindToLoginScreen 方法。

但是,这种方法的问题是我必须记住在 Storyboard上为我添加到项目中的所有新 View Controller 创建所说的展开转场。

到目前为止,我认为理想的计划是能够以编程方式创建展开转场,而不是使用 Storyboard。因此,默认情况下,我的 unwindToLoginScreen() 扩展方法可以在任何新的 View Controller 中使用。像这样的东西:

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

有没有可能做这样的事情?

最佳答案

您不能在代码中创建 segue,但您可以弹出到 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)
}

关于ios - 是否可以通过编程方式创建 unwind segue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56280112/

相关文章:

ios - 使用 segue 将已解析的数据从父 View 传递到 subview

c# - Xamarin 上的 ToLocalTime 是否损坏?

ios - 使用 AVPlayer 在后台播放视频会出现 AspectFill 和循环问题

ios - 如何将委托(delegate)添加到 tableViewCell 中的对象?

json - 使用 Codable Protocol 或外部工具进行 JSON 映射

iOS位置授权: dynamic content of NSLocationAlwaysAndWhenInUseUsageDescription

ios - 使用 ECSlidingViewController 更改为新的 Storyboard

iphone - 计算两个时间间隔之间的时差-逻辑问题

ios - 如何获取Facebook的个人资料图片?

ios - 第一次启动/segue swift