UITabBarController:没有为所有子选项卡

时间:2016-01-11 10:01:30

标签: ios swift uitabbarcontroller viewdidload

我有一个基于Storyboard的iOS Swift应用程序,其中UITabBarController作为主视图控制器,后者又有四个选项卡。在初始化时,我想预加载所有这些,以便让它们在我的全局数据中注册,如下所示:

主视图控制器:

class MainViewController : UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        for viewController in self.viewControllers!
        {
            let v = viewController.view;
            print("ViewController: \(v)")
        }
    }

访问.view会触发viewDidLoad(),但这显然无效。

子视图控制器:

class Sub1ViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        Global.sub1vc = self    // register in global data
    }
}

原因是子控制器'即使用户尚未选择选项卡,选项卡也应显示包含信息的徽章。

程序启动时,所有四个子VC都列在打印输出中,但仅限于否。 2调用viewDidLoad()方法(虽然它实际上不是UITabBarController的直接子项,但中间有SplitViewController。之后,子VC没有。 1' s viedDidLoad()被调用,因为它实际显示在显示屏中。只有当没有。用户实际上选择了3或4,他们的viewDidLoad()被调用。

我怎样才能实现这个"权利"办法?我是否必须为所有子控制器实现init方法?

另外:

我现在似乎已经解决了这个问题:在主视图控制器中viewDidLoad()我现在这样做:

override func viewDidLoad() {
    super.viewDidLoad()
    for viewController in self.viewControllers!
    {
        if viewController.title == "No. 2" {
            if let navctr = viewController as? UINavigationController,
                   ctr = navctr.viewControllers[0] as? Sub2ViewController {
                        G.sub2vc = ctr
            }
        }
    }
}

这有效,但它依赖于(第一个)给予最顶层子控制器的唯一标题(在这种情况下为UINavigationController,但其他类型也适用于其他标签)和(第二个) )实际上知道,即编码,从那里使用什么方式来访问实际的子控制器(在这种情况下,通过导航控制器)。我必须承认,相应的目标控制器注册本身似乎更优雅,更不容易出错,因为没有额外的依赖。

3 个答案:

答案 0 :(得分:0)

听起来,任何依赖于Global.sub1vc的逻辑都应该重做。捏造UIKit加载所有ViewController不是答案。

答案 1 :(得分:0)

The clean way to do it is to update the badge information in awakeFromNib of each view controller instead of viewDidLoad.

答案 2 :(得分:-1)

MainViewController viewDidLoad中,您可以设置selectedIndex加载每个视图:

// Load all views
for num in 0...self.tabBar.items!.count {
    self.selectedIndex = num
}

// Set default index
self.selectedIndex = 0;