2017-05-23 9 views
-1

私はiOSプログラミングの独学者で、初心者の教科書を1つ手がけました。私は最初のモバイルアプリケーションを公開しようとしているので、私はコードを取り直していきます。私が使用した教科書は「Dependency Injection」を強調しましたが、私は単純な例をより複雑なアプリケーションに適応させるのに苦労しました。Swift - AppDelegate.swiftの依存性注入を設定する

このアプリケーションは、シェルとして動作し、読み込むためにtxtファイルを取得/解析します。アプリケーションが他のタブを有することになるので、私はその後TabBarController内にそのNavigationController埋め込ま

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 
} 

:私は正常/次のコードを使用してポピュレート必要そのデータを解析し、TableViewController取得私のモデルを、接続されています。私は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 
} 

このエラーを修正するためのソリューションがあります:私は2つの異なるアプローチを試してみました

'致命的なエラーオプションの値をアンラップしながら、予想外にnilを見つけ'またはこのプロセスについて間違っていますか?ここでも、txtファイルを取得して辞書を作成するファイルがあります。その辞書にアクセスするために別のTableViewControllerが必要ですが、これは私が最初のデザインで行ったのと同じファイル内ではなく、最も効率的でリンゴを促進する方法でこれを実現したいのです。

ありがとうございました!

+0

どのようにウィンドウを作成していますか? –

+0

[iOS self.windowの作成可能な複製]?(https://stackoverflow.com/questions/21380567/ios-self-window-when-is-it-created) –

+0

ユニバーサルシングルすべてのビューはプログラムによって作成されたものではなく、インターフェースビルダーで作成されています。 – Frank

答えて

0

依存性注入私はあなたがTyphoonを使用することをお勧めします。私の経験から、それは最高のツールの1つです。これは、次のようなアプリケーションアセンブリを作成するのに役立ちます:

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