我位于UIViewController
的第3 UINavigationController
位,并希望在切换包含UIViewController
的{{1}}标签之前解除所有UITabBarController
个问题。
UINavigationController
上面的代码不会切换标签栏索引。似乎 self.navigationController?.popToRootViewControllerAnimated(true)
self.tabBarController?.selectedIndex = 1
之后的代码永远不会运行。
我有什么选择?
答案 0 :(得分:2)
AFAIK,没有API为popToRootViewControllerAnimated
提供完成块,我猜测一旦你弹出VC,它就会消失,不再执行代码。这就像你想要在动画完成后提供一个完成块。
UINavigationController
API本身不提供任何选项。
但是,通过结合使用CoreAnimation框架和NSNotifications,可以添加一个发布通知的完成块,根视图控制器可以监听。
你甚至可以在没有CoreAnimation技巧的情况下逃脱,只是在popToRootViewControllerAnimated
之后发布通知,但我还没有尝试过。
这将是堆栈中底部视图控制器的代码:
class DetailViewController: UIViewController {
@IBAction func popAndSwitchTabs(sender: AnyObject) {
CATransaction.begin()
CATransaction.setCompletionBlock { () -> Void in
NSNotificationCenter.defaultCenter().postNotificationName("switchTabsNotification", object: nil)
}
self.navigationController?.popToRootViewControllerAnimated(true)
CATransaction.commit()
}
}
然后在堆栈的顶视图控制器中使用这样的代码:
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "switchTabs", name: "switchTabsNotification", object: nil)
}
func switchTabs() {
self.tabBarController?.selectedIndex = 1
}
}
这是一个快速的示例项目,我可以在Github上尝试: https://github.com/obuseme/PopAndSwitchExample