popToRootViewControllerAnimated和Switch TabBar索引

时间:2015-12-14 21:14:23

标签: ios swift uiviewcontroller uinavigationcontroller

我位于UIViewController的第3 UINavigationController位,并希望在切换包含UIViewController的{​​{1}}标签之前解除所有UITabBarController个问题。

UINavigationController

上面的代码不会切换标签栏索引。似乎 self.navigationController?.popToRootViewControllerAnimated(true) self.tabBarController?.selectedIndex = 1 之后的代码永远不会运行。

我有什么选择?

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