我有UINavigationController
作为rootViewController
,最终将UITabBarController
推到了堆栈顶部。
UITabBarController
有2页。每个页面都以UINavigationController
为根,假设这是UINavigationController
A和B.
A和B中的每一个都有一个UIViewController作为根。我们假设这是C和D.
现在我正在上课UIViewController
C.我希望从C中获得对UITabBarController
的引用。所以我这样做:
self.tabBarController
self.navigationController?.tabBarController
所有这些都返回零。如何获取UITabBarController
对象的引用?
答案 0 :(得分:-1)
根据我对这种等级制度的体验,只需从另一个方向开始,从顶部开始。
有了这样的架构,我假设您期望有一个视图控制器始终位于顶部,在您的情况下是导航控制器。我会添加一些代码来支持“主实例”过程:
static var mainInstance: TopNavigationController!
func viewDidLoad() {
// super...
TopNavigationController.mainInstance = self
// ...
}
现在通过它可以减少访问标签栏视图控制器的混乱:
if let tabBarController = TopNavigationController.mainInstance.myTabBarViewController {
// Do stuff
}
在您的情况下,我会更深入地在标签栏视图控制器上创建“当前实例”过程。这仍假设只会同时加载一个实例,但预计不会一直存在。这没什么区别:
static weak var currentInstance: MyTabBarViewController? // We want it weak so it is released if we navigate back from it
func viewDidLoad() {
// super...
MyTabBarViewController.currentInstance = self
// ...
}
这些是一些有点懒惰的程序,但对于许多解决方案来说都很棒,并且可以在深层链接等情况下节省大量时间。
但是,如果这是不可能的,并且您通常只需要访问这些元素(可以是多个控制器)而不使用静态属性,那么仍然可以在管道中发送委托或具体类:
例如,如果标签栏视图控制器需要执行在层次结构中触发的内容,则可以执行以下操作:
let controller = SomeController()
controller.ownerTabBarController = self
self.navigationControllerAtIndex(1).push(controller...
然后SomeController
显然有一个弱的属性:
weak var ownerTabBarController: MyTabBarViewController?
可以做到:
ownerTabBarController?.executeSomeMethod()
我希望这能为您提供有关如何在视图控制器之间更好地创建消息传递的一些想法。即使您稍后更改了层次结构(这很容易发生),这些过程中的任何一个都应该有效。