委托不能调用UINavigationController popToRootViewController方法?

时间:2017-08-22 02:30:04

标签: ios swift uinavigationcontroller delegates

我有一个非常好用的UINavigationController。每个视图控制器都有自己的按钮,将堆栈弹回到它的根目录,这也很好用。但是,我还希望能够通过按下标签栏上的按钮(显然是在导航堆栈之外的完全不同的类中)将堆栈弹回到其根目录。

因此,我在tab bar类中创建了一个委托,它在堆栈顶部找到视图控制器,并调用该视图控制器中的方法将堆栈弹回到根目录。我在控制台上打印了一些内容,以验证代理是否已正确设置。一切都完全正常,除了按下标签栏不会将堆栈弹回到它的根目录。

思想?

这是UINavigationController堆栈顶部的视图控制器

class BlankViewController202: UIViewController, MainContainerViewControllerDelegate {

    // pop to root
    func popToRoot() {
        self.navigationController?.popToRootViewController(animated: true)
        print("success")
    }

}

当从视图控制器中调用上述函数时(当用户按下视图控制器本身上的按钮时),它会弹出堆栈。但是当标签栏中的委托调用这个相同的方法时,它不会弹出堆栈(但它会打印到控制台,所以我知道它正确连接)。

这是按钮位于标签栏中的位置,按下该按钮时应将堆栈弹回其根目录

protocol MainContainerViewControllerDelegate {
    func popToRoot()
}

class MainContainerViewController: UIViewController {

    func moveToTab3(sender: UIButton!) {
        // ...
        let banana = BlankViewController202()
        self.delegate = banana
        delegate?.popToRoot()
    }

}

3 个答案:

答案 0 :(得分:1)

问题是BlankViewController202()创建了一个全新的,独立的BlankViewController202 - 它是特定的BlankViewController202,它已经作为导航控制器界面的一部分在界面中。 你想与之谈话的BlankViewController202。

答案 1 :(得分:0)

只需按照一些步骤

1)在UINavigationViewController中创建一个AppDelegate的对象,然后您可以使用app delegate的共享对象访问它。

2)moveToTab3的第一行将是[Appdelegate sharedObject].navigationViewControllerVariable = self.navigationViewController

3)在你的委托方法中写下这一行

[[Appdelegate sharedObject].navigationViewControllerVariable popToRootViewController:true] 

这肯定会有效:)

答案 2 :(得分:0)

我认为,你错误委托模式。您可以再次看到模型委托使用协议。如果使用协议,则删除行代码" let banana = BlankViewController202()"。