导航栏无法与视图控制器

时间:2015-09-01 08:06:06

标签: swift uinavigationcontroller uinavigationbar unwind-segue

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

我提到了this question解开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之间拖出 - 并命名展开segue 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之间拖动导航控制器,并修改向weakSelf.navidationController!.performSegueWithIdentifier("unwindToA", sender: weakSelf)的展开segue操作调用,但它不起作用。我在解决这个问题时出错了吗?

2 个答案:

答案 0 :(得分: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的标题,如果您遇到问题,可以确保它总是被调用。

答案 1 :(得分:0)

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