【问题标题】:UINavigationController popToRootViewController method cannot be called by a delegate?UINavigationController popToRootViewController 方法不能被委托调用?
【发布时间】:2017-08-22 02:30:04
【问题描述】:

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

因此,我在选项卡栏类中创建了一个委托,它在堆栈顶部找到视图控制器并调用该视图控制器中的方法将堆栈弹出回根。我在控制台上打印了一些东西,以验证委托设置是否正确。一切都按原样工作,只是按下标签栏不会将堆栈弹回其根目录。

想法?

这是 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()
    }

}

【问题讨论】:

  • 所以...您有一个 TabBarController...其中一个选项卡包含一个 NavigationController...当您点击第三个选项卡时,您希望 NavController(如果它是当前选项卡?)弹出到它的根目录,你想显示第三个标签...听起来对吗?

标签: ios swift uinavigationcontroller delegates


【解决方案1】:

问题在于BlankViewController202() 制作了一个全新的、独立的 BlankViewController202——它不是作为导航控制器界面的一部分已经在界面中的特定 BlankViewController202。 你想与之交谈的是 BlankViewController202。

【讨论】:

  • (1) 我可以通过代理调用该副本吗? (2) 有没有其他方法可以弹出到该确切视图控制器之外的导航堆栈的根?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    只需执行一些步骤

    1) 在AppDelegate 中创建一个UINavigationViewController 的Object,您可以通过app delegate 的共享对象访问它。

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

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

    [[Appdelegate sharedObject].navigationViewControllerVariable popToRootViewController:true] 
    

    这肯定会工作:)

    【讨论】:

    • 该应用程序有很多导航控制器,其中包含很深的堆栈,并且在那里使用单例的想法听起来不是一个可靠的计划。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多