如何正确访问此嵌套流中的tabBarController?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何正确访问此嵌套流中的tabBarController?相关的知识,希望对你有一定的参考价值。

我有一个UINavigationController作为rootViewController,它最终将UITabBarController推到了堆栈顶部。

UITabBarController有2页。每个页面都有UINavigationController作为根,让我们说这是UINavigationController A和B.

A和B中的每一个都有一个UIViewController作为根。让我们说这是C和D.

现在我正在上课UIViewController C.我想从C中获得对UITabBarController的引用。所以我这样做:

  • self.tabBarController
  • self.navigationController?.tabBarController

所有这些都返回零。如何获取UITabBarController对象的引用?

答案

根据我对这种等级制度的体验,只需从另一个方向开始,从顶部开始。

有了这样的架构,我假设您期望有一个视图控制器始终位于顶部,在您的情况下是导航控制器。我会添加一些代码来支持“主实例”过程:

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()

我希望这能为您提供有关如何在视图控制器之间更好地创建消息传递的一些想即使您稍后更改层次结构(这很容易发生),这些过程中的任何一个都应该有效。

以上是关于如何正确访问此嵌套流中的tabBarController?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 访问 tabBarController 中的 ObjectAtIndex?

如何从 AppDelegate.m 访问 tabBarController?

如果它在 TabBarController 中,如何从 AppDelegate 访问 ViewController 的属性?

如何访问 Symfony2 中的嵌套参数值?

我的 NSJSONSerialization 似乎给了我嵌套的 NSDictionaries——如何访问外部键中的特定键?

如何访问苹果照片流中的文件