(Swift)当多个视图控制器导致相同的视图时展开 segue?

Posted

技术标签:

【中文标题】(Swift)当多个视图控制器导致相同的视图时展开 segue?【英文标题】:(Swift) Unwind segue when multiple view controllers lead to same view? 【发布时间】:2015-07-24 21:15:19 【问题描述】:

我正在尝试编写一个刽子手游戏的代码,但遇到了展开 segues 的问题。我有多个视图控制器,它们最终都指向同一个视图,用户在其中扮演真正的刽子手。 但是,根据呈现的控制器,我希望游戏处于不同的“模式”(即:多人游戏、单人游戏等)。我正在尝试添加一个再次播放按钮,该按钮可以展开到前一个视图控制器,但我不确定当用户可以采取多条路径到达该视图时如何展开。

换句话说,我的应用是这样的:

A -> B -> C 或

A -> D -> C 其中 C 可以(理想情况下)展开为 D 或 B。

我想知道实现它的最佳方法是什么?我应该将所有视图控制器都嵌入导航控制器吗?或者有没有办法根据特定条件呈现特定的视图控制器?感谢您的帮助!

【问题讨论】:

【参考方案1】:

如果您有任何自定义逻辑并希望以编程方式调用 unwind segue 到不同的视图控制器,方法如下:

    unwindFromCViewController 添加到BViewControllerDBViewController

    BViewController.swift

    class BViewController : UIViewController 
        @IBAction func unwindFromCViewController(segue:UIStoryboardSegue) 
        
    
    

    DViewController.swift

    class DViewController : UIViewController 
        @IBAction func unwindFromCViewController(segue:UIStoryboardSegue) 
        
    
    

    在你的故事板中,创建这个 segue 并给它一个标识符,并将它链接到你在上面定义的动作unwindFromCViewController

        

        

    从代码中调用 unwind segue:

    self.performSegueWithIdentifier("unwindFromCViewControllerSugueId", sender: self)
    

这样,您可以放松到之前的视图,无论它来自哪里。

【讨论】:

嗨,segue 不是为模态显示的视图控制器创建的。不知道为什么。很奇怪。【参考方案2】:

unwind segue 过程一般会自动判断之前的 UIViewController 实例。确切的过程在 Apple 的 Tech Note 中进行了描述,但总结如下:

从启动展开的视图控制器开始 搜索顺序如下:

    响应者链中的下一个视图控制器被发送一个 viewControllerForUnwindSegueAction:fromViewController:withSender: 信息。对于模态呈现的视图控制器,这将是 调用的视图控制器 presentViewController:animated:completion:。否则,该 父视图控制器。

    默认实现搜索 接收者的childViewControllers 数组,用于需要的视图控制器 处理展开动作。如果没有接收者的子视图 控制器想要处理展开动作,接收器检查 是否要处理 unwind 动作,如果它返回 self 做。在这两种情况下, canPerformUnwindSegueAction:fromViewController:withSender: 方法是 用于确定给定的视图控制器是否想要处理 放松动作。

    如果没有返回视图控制器 viewControllerForUnwindSegueAction:fromViewController:withSender: 在 第一步,搜索从下一个视图控制器重复 响应者链。

因此,确切的过程将取决于您呈现视图控制器 C 的方式 - 例如,通过模态呈现 segue 或 UINavigationController 上的推送 segue,但只要 B 和 D 都实现了展开操作,您应该是不错。

【讨论】:

【参考方案3】:

如果您将其推送到导航堆栈上,我会简单地调用代码 popViewController:animated 以转到呈现控制器,或者如果它以模态方式呈现,则调用 dismissViewController:animated

【讨论】:

@Jared 有两种方法可以在 ios 上的当前视图控制器之上显示新的视图控制器,名称、“推送”和“呈现”。所以这里的“模态呈现”是针对第二种情况的。

以上是关于(Swift)当多个视图控制器导致相同的视图时展开 segue?的主要内容,如果未能解决你的问题,请参考以下文章

多个位置的相同TableView swift 3

在两个视图控制器之间展开 Segue 来回 Swift

在一个视图控制器中使用不同的按钮上传多个图像(iOS、Xcode 9、Swift 4)

重用自定义 tableView 单元格时重复显示相同的子视图(Swift 4.1)

Swift - 在展开可选值时意外发现 nil - 从委托调用变量

Swift:UIButton 不可点击的重叠视图