Swift - 在AppDelegate.swift

时间:2017-05-23 17:20:15

标签: ios swift dependency-injection appdelegate

我是一名自学成才的iOS编程新手,并通过一本初学者教科书。我试图发布我的第一个移动应用程序,所以我要回过头来清理我的代码。我使用的教科书强调了依赖注入'但我一直在努力使他们的简单例子适应更复杂的应用程序。

该应用程序作为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
}

然后我将这个NavigationController嵌入到TabBarController中,因为该应用程序将包含其他选项卡。我尝试了设置rootViewController的相同过程,然后向下钻取,直到我可以设置我的数据变量,但我找不到正确的方法来分层ViewControllers并继续得到错误;

'致命错误:在展开“可选”值时意外发现nil

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

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才能访问该字典以填充自己,但我希望以最有效和苹果推广的方式实现这一点,而不是像我在第一次设计中那样在同一个文件中实现。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:-1)

对于依赖注入,我建议您使用Typhoon。从我的经验来看,它是最好的工具之一。这将帮助您实现应用程序组件,如:

/* 
 * 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())
    }
}