我有三个主视图控制器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操作调用,但它不起作用。我在解决这个问题时出错了吗?
答案 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)
所以问题很简单:在我尝试修改故事板并删除那些不必要的导航控制器后,它表现得很好。