在没有 segue 的情况下展开到特定的视图控制器

Posted

技术标签:

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

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

【问题讨论】:

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

【讨论】:

以上是关于在没有 segue 的情况下展开到特定的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 在没有情节提要的情况下展开 segue

在导航控制器不工作的情况下快速展开 segue Xcode 10

将 segue 展开到尚未呈现的视图控制器?

展开后执行segue

展开 segue 不触发

在没有 Segue 的情况下从 UITableViewCell 打开视图控制器