2017-05-23 152 views
-1

我是一位自学成才的iOS编程新手,并且已经完成了一本初学者教科书。我正在尝试发布我的第一个移动应用程序,所以我正在回头并清理我的代码。我使用的教科书强调“依赖注入”,但我一直在努力将他们的简单示例应用于更复杂的应用程序。Swift - 在AppDelegate.swift中设置依赖注入

该应用程序作为一个shell运行并检索/解析txt文件来填充。我成功连接我的模型,它检索/分析数据,并使用下面的代码需要填充TableViewController:

MyTableViewController { 
    var data: Data! 
} 

AppDelegate { 
    var window: UIWindow? 
    let data = Data() 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

     let navCon = window!.rootViewController as! MyNavigationController 
     let tableVC = navCon.topViewController as! MyTableViewController 
     tableVC.data = data 

     return true 
} 

我再嵌入TabBarController内NavigationController因为应用程序将有其他选项卡。我尝试了设置rootViewController的相同过程,然后深入研究,直到我可以设置我的数据变量,但我找不到正确的方法来分层ViewControllers并不断收到错误;

“致命错误:意外发现零而展开的可选值”

我尝试了两种不同的方法:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

     let tabBarCon = window!.rootViewController as! MyTabBarController 
     let navCon = tabBarCon.presentedViewController as! MyNavigationController 
     let tableVC = navCon.topViewController as! MyTableViewController 
     tableVC.data = data 

     return true 
} 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

     let tabBarCon = window!.rootViewController as! MyTabBarController 
     let navCon = MyNavigationController() 
     tabBarCon.viewControllers = [navCon] 

     let tableVC = navCon.topViewController as! MyTableViewController 
     tableVC.data = data 

     return true 
} 

有没有纠正这一错误的解决方案或者我正在处理这个过程是错误的?再次,我有一个文件,该文件包含一个txt文件,然后创建一个字典。我需要一个单独的TableViewController来访问该字典来填充自己,但我想以最有效的和苹果提升的方式来实现这一点,而不是像我在第一次设计时那样在同一个文件中。

感谢您的帮助!

+0

你是如何创建窗口? –

+0

[iOS self.window可能重复 - 它是什么时候创建的?](https://stackoverflow.com/questions/21380567/ios-self-window-when-is-it-created) –

+0

我开始使用通用单-view应用程序,并且所有视图都是在界面构建器中创建的,而不是以编程方式。 – Frank

回答

0

对于依赖注入我建议您使用Typhoon。从我的经验来看,这是最好的工具之一。这将帮助你才达到应用asembly像:

/* 
* This is the definition for our AppDelegate. Typhoon will inject the specified properties 
* at application startup. 
*/ 
public dynamic func appDelegate() -> AnyObject { 
    return TyphoonDefinition.withClass(AppDelegate.self) { 
     (definition) in 

     definition.injectProperty("cityDao", with: self.coreComponents.cityDao()) 
     definition.injectProperty("rootViewController", with: self.rootViewController()) 
    } 
} 
+0

我宁愿创建自己的代码,因为我刚刚开始并希望了解我正在实施的概念 – Frank

0

我发现通过这个线程解决方案;

Aassigning a value to a view controller from AppDelegate.swift

结果可以通过重新配置我试图将第二溶液来实现;

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    let tabBarCon = window!.rootViewController as! MyTabBarController 
    let tabBarRootVCs: Array = tabBarCon.viewControllers! 

    let navCon = tabBarRootVCs[0] as! MyNavigationController 

    let tableVC = navCon.topViewController as! MyTableViewController 
    tableVC.data = data 

    return true 
}