【问题标题】:Navigation bar fails to unwind segue along with view controller导航栏无法与视图控制器一起展开 segue
【发布时间】:2015-11-26 09:24:29
【问题描述】:

我有三个主视图控制器 A、B、C,它们按show segue 的顺序呈现。所有三个视图控制器都嵌入在它们自己的导航控制器中。在关闭 C 上呈现的模态控制器 D 后,我想回到控制器 A 并在它出现之前重新加载数据。

我参考了this question的方案unwind segue,在控制器A中写了一个动作(我用AViewController来表示控制器A的类):

@IBAction func prepareForUnwindSegue(segue: UIStoryboardSegue?) {
    if let destController = segue?.destinationViewController as? AViewController {
        destController.reload()
    }
}

override func canPerformUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject) -> Bool {
    return self.respondsToSelector(action)
}

我通过上述操作在控制器 A 和 C 之间拖出退出,并将展开转场命名为 unwindToA。然后在名为 CViewcontroller 的控制器 C 类中,我在一个 ActionSheet 中调用模态视图 D,如下所示:

let presentDAction = UIAlertAction(title: "Present D", style: .Default, handler: {(_) -> Void in
    let controller: AnyObject? = self.storyboard!.instantiateViewControllerWithIdentifier("DView")
    if let c = controller as? DViewController {
        let navi = UINavigationController(rootViewController: c)
        navi.modalPresentationStyle = UIModalPresentationStyle.FullScreen

        // the following block wait and execute after view controller D dismissed
        c.refreshAndUnwind = {[weak self](refresh) in 
            if let weakSelf = self {
                if(refresh) {
                    weakSelf.performSegueWithIdentifier("unwindToA", sender: weakSelf)
                }
            }
        }
    }
 })

视图控制器确实随着重新加载数据成功展开。但是,导航栏似乎仍然在控制器 C 上,并且它的标题消失了。我尝试在 A 和 C 之间拖动退出导航控制器,并将 unwind segue 操作调用修改为 weakSelf.navidationController!.performSegueWithIdentifier("unwindToA", sender: weakSelf),但它不起作用。我是否在我的 segue 展开时做错了什么导致了这个问题?

【问题讨论】:

    标签: swift uinavigationcontroller uinavigationbar unwind-segue


    【解决方案1】:

    有时使用故事板并不是做事的最佳方式。在你的情况下,我会这样做:

        var viewControllers = self.navigationController!.viewControllers
        var controllerA = viewControllers[0] as! ControllerA
        controllerA.reloadStuff()
        var newViewControllers = [ controllerA ]
        self.navigationController!.setViewControllers(newViewControllers, animated: true)
    

    这样代码更简洁。如果您遇到问题,可以在每个视图的 viewDidAppear 中设置 navigationItem 的标题,您可以确保它总是会被调用。

    【讨论】:

    • 但是,您的代码中的 viewControllers 属于 ControllerC 类,因为这里的 self 属于这种类型。因此我不能将它们投射到 ControllerA 中。
    • 为什么他们有自己的导航控制器?
    • 天哪,这就是重点!在我尝试修改和删除其他两个导航控制器后,它工作正常!谢谢!
    • 好吧,我一直在寻找展开导航控制器很长时间才能看到这个答案。
    【解决方案2】:

    所以问题很简单:在我尝试修改我的故事板并删除那些不必要的导航控制器后,它执行得很好。

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      相关资源
      最近更新 更多