2017-08-22 18 views
-1

我有一个很好的UINavigationController。每个视图控制器都有自己的按钮,可以将堆栈弹回到其根目录,这也非常棒。不过,我也想通过按下标签栏上的按钮(显然是在导航堆栈外的完全不同的类中)将堆栈弹回到其根目录。UINavigationController popToRootViewController方法不能由委托调用吗?

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

想法?

这是在一个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

因此......你有一个TabBarController ......其中一个Tabs包含一个NavigationController ......当你点击第三个Tab时,你想让NavController(如果它是当前选项卡?)弹出到其根目录,并且你想要显示第三个标签......这听起来是对的吗? – DonMag

回答

1

的问题是,BlankViewController202()使得一个全新的,独立的BlankViewController202 - 它是而不是已作为导航控制器界面的一部分的特定BlankViewController202。 您想与之对话的BlankViewController202。

+0

(1)该副本是否可供我通过代理进行调用? (2)是否有任何其他方式弹出到精确视图控制器之外的导航堆栈的根目录? –

0

只要遵循一些步骤

1)使UINavigationViewController一个对象AppDelegate,您可以用应用程序委托的共享对象访问。

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

3)在你的委托方法在此线

[[Appdelegate sharedObject].navigationViewControllerVariable popToRootViewController:true] 

这肯定会工作:)

+0

该应用程序有很多导航控制器,其中有很深的堆栈,并且在那里使用单例的想法听起来不像一个可靠的计划。 –

0

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