在ViewControllers中快速注入vars

时间:2018-07-09 06:44:16

标签: swift appdelegate

iOS开发方面我是新手,我正在尝试构建我的第一个应用程序。我正在在线平台上学习课程,该课程在 AppDelegate -> application didFinishLaunchingWithOptions

let navigationController = window?.rootViewController as! UINavigationController
let notebooksListViewController = navigationController.topViewController as! NotebooksListViewController
notebooksListViewController.dataController = dataController

此应用具有一个Navigation controller开头的UIViewController

我在这里有2个问题,首先是为什么这样做有效,我的意思是,我在AppDelegate中,因此NotebooksListViewController(应用程序的第一个视图)尚未实例化(我认为),那么为什么我可以在其中注入变量?

另一方面,第二个问题是,如何在不同的场景中执行此操作?我有一个TabBarViewController作为第一个场景,第一个选项卡是一个UITableViewController,我想以相同的方式注入我的dataController var,如何实现呢?我无法做到,也无法理解。

谢谢。

2 个答案:

答案 0 :(得分:0)

它有效,因为有一些Xcode魔术: 在目标设置常规选项卡中,主界面条目指定在应用启动时将自动加载的情节提要的名称:< / p>

DeploymentInfo

在情节提要中,将实例化 Initial View Controller 。看来这是一个 UINavigationController 。 由于这是自动完成的,因此它可以正常工作-直到您想做一些特别的事情:-)

如果您想从不同的场景开始-也许从不同的视图控制器开始-只需将主界面更改为另一个情节提要,即 Initial View Controller >(位于情节提要板内部)或两者兼有。

或者,您可以自己启动,只需将主界面留空,然后在应用程序委托(didFinishLaunchingWithOptions)中创建自己的视图控制器,就像

self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
if let tabVC = mainStoryboard.instantiateViewControllerWithIdentifier("TabCtrl") as? UITabBarController {
    self.window?.rootViewController = tabVC

    // Access the subcontrollers, or create them
    // Initialize their values
    // tabVC.viewControllers[0].data = ...

} else {
    // Ooops
}

self.window?.makeKeyAndVisible()

答案 1 :(得分:0)

第一个问题的答案

因为方法名称是自解释的didFinishLaunchingWithOptions,这意味着您的应用程序已完成启动并带有选项,并且即将在前台进入,因此此处应用程序需要设置rootViewController,因此在此方法控制器中您要设置为视图控制器开始了,这就是为什么您可以在其中注入变量

第二个问题的答案

let navigationController = window?.rootViewController as! UITabbarController
let VC = navigationController.childViewController
//Now Using VC you can access all you controller of tabbar controller
let notebooksListViewController = navigationController.topViewController as! 
NotebooksListViewController
notebooksListViewController.dataController = dataController

现在如上所示,您可以使用VC来访问视图控制器

但请注意此处,因为VC返回viewcontroller数组,因此您需要检查要访问的垂直VC