我有一个非常好用的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()
}
}
答案 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()"。