Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift-在ViewController中注入变量_Swift_Appdelegate - Fatal编程技术网

Swift-在ViewController中注入变量

Swift-在ViewController中注入变量,swift,appdelegate,Swift,Appdelegate,我对iOS的开发感到非常自豪,我正在尝试构建我的第一个应用程序。我正在一个在线平台上学习一门课程,在 AppDelegate->application didnishlaunchingwithoptions: let navigationController = window?.rootViewController as! UINavigationController let notebooksListViewController = navigationController.topViewCo

我对iOS的开发感到非常自豪,我正在尝试构建我的第一个应用程序。我正在一个在线平台上学习一门课程,在
AppDelegate->application didnishlaunchingwithoptions

let navigationController = window?.rootViewController as! UINavigationController
let notebooksListViewController = navigationController.topViewController as! NotebooksListViewController
notebooksListViewController.dataController = dataController
此应用程序有一个
导航控制器
,它以
UIViewController
开头

我这里有两个问题,首先是为什么这样做,我的意思是,我在
AppDelegate
,所以
NotebooksListViewController
(应用程序的第一个视图)还没有实例化(我想),那么为什么我能够在其中注入变量呢

另一方面,第二个问题是,我如何在不同的场景中做到这一点?我有一个
TabBarViewController
作为第一个场景,第一个选项卡是一个
UITableViewController
,我想以同样的方式注入我的dataController变量,我如何才能做到这一点?我无法做到,也无法理解


提前感谢。

它可以工作,因为有些Xcode魔法: 在目标设置的“常规”选项卡中,主界面条目指定应用程序启动时自动加载的情节提要的名称:

在故事板中,初始视图控制器将被实例化。这似乎是一个UINavigationController。 因为这是自动完成的,所以它只会工作-直到您想做一些特殊的事情:-)

如果您想从不同的场景(可能是从不同的视图控制器)启动,您可以将主界面更改为另一个故事板、初始视图控制器(在故事板内部)或两者兼而有之

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

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

回答您的第一个问题

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
由于方法名称是不言自明的
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

谢谢您的回复。这个应用程序本身实例化了初始视图控制器(我只支持这个VC)。我理解。但是如何在代码中获得具体的实例呢?我的意思是,在上面的代码中,我可以插入导航控制器,但无法在TabBarController中获取TableViewController的实例。tab bar控制器有一个属性
ViewController
,它是一个包含所有子视图控制器的数组。感谢您的帮助。在我的项目中,我的初始视图控制器是TabBarViewController,第一个选项卡是UITableViewController,如何获取实例?