【问题标题】:Unwind to a specific view controller without a segue在没有 segue 的情况下展开到特定的视图控制器
【发布时间】:2020-10-08 15:19:51
【问题描述】:

不使用故事板时,如何获得与展开转场相同的功能?假设我有一个导航控制器,里面有几个视图控制器,我想平滑地放松回到某个控制器。你将如何做到这一点?

【问题讨论】:

  • 您可以使用popToViewController 来实现该功能。 Reference
  • 是否有一种语法糖方法可以做到这一点,而不必持有一堆控制器引用@MidhunMP?就像情节提要的放松 IBAction 一样。
  • 您可以在导航控制器上编写一个扩展,它将获取您必须展开的 vc 的类名,您可以从 viewcontroller 数组中找到该特定类的对象并将其传递给上面提到的放松方法。
  • 这是个好主意@MidhunMP。更好的是,有没有办法在控制器上设置一个标识符,然后通过标识符从导航堆栈中获取控制器?这样,如果有多个相同的控制器类型,您可以转到特定的一个。
  • 是的,您可以在下面查看我的答案。我添加了一个标识符以返回特定的视图控制器

标签: swift uinavigationcontroller unwind-segue


【解决方案1】:

您可以在 UINavigationController 上编写一个扩展来实现这一点。根据您的 cmets,您希望设置一个标识符并使​​用该特定标识符返回。为此,您可以编写一个简单的协议:

protocol Unwindable {
    var identifier: String { get set }
}

您的所有视图控制器都应确认此协议并设置标识符值。实现 UINavigationController 扩展,如:

extension UINavigationController {

    func goBackToInstance(withIdentifier identifier: String) {
        let mapped = self.viewControllers.compactMap{ $0 as? Unwindable }
        for vc in mapped.reversed() {
            if (vc.identifier == identifier) {
                self.popToViewController(vc as! UIViewController, animated: true)
            }
        }
    }
}

然后您可以使用以下命令返回:

self.navigationController?.goBackToInstance(withIdentifier: "Your Identifier")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2012-08-22
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多