我有一个基于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
,但其他类型也适用于其他标签)和(第二个) )实际上知道,即编码,从那里使用什么方式来访问实际的子控制器(在这种情况下,通过导航控制器)。我必须承认,相应的目标控制器注册本身似乎更优雅,更不容易出错,因为没有额外的依赖。
答案 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;