2

TyphoonとSwiftを使用してUIStoryboardからインスタンス化されたUIViewControllerを注入する適切な方法は何ですか?

どちらのサンプル アプリにも明確な例が見つかりません。ドキュメントから Objective C コードを翻訳すると、例外がスローされます。

以下は、私の AppAssembly のコードです。

public dynamic func loginViewController() -> LoginViewController {
    return TyphoonDefinition.withClass(LoginViewController.self) {
        (definition) in

        definition.injectProperty("socialClient",with:self.coreComponents.socialClient())
        //definition.scope = TyphoonScope.Singleton
    } as LoginViewController
}

そして、これはスローされる例外です:

0x10636ca1c:  jne    0x10636ca10               ; swift_dynamicCastClassUnconditional + 48
0x10636ca1e:  leaq   0x36b3d(%rip), %rax       ; "Swift dynamic cast failed"
0x10636ca25:  movq   %rax, 0xb4a2c(%rip)       ; gCRAnnotations + 8
0x10636ca2c:  int3   
0x10636ca2d:  movq   %rdi, %rax
0x10636ca30:  popq   %rbp
0x10636ca31:  retq   
0x10636ca32:  nopw   %cs:(%rax,%rax)

「Swift の動的キャストが失敗しました」は、Objective C を使用して可能だったことが Swift では不可能であると私に信じさせます。

誰もこれを機能させることができましたか?どんな援助でも大歓迎です。このライブラリは本当に素敵で、私は本当にそれを使いたいと思っています。

4

2 に答える 2

3

Swift と Objective-C の両方で Typhoon を使用すると、次のルールが適用されます。

  • ビルド時に、アセンブリ インターフェイスはオブジェクト インスタンスをアセンブルするためのレシピを返します。これには、構成と連携するコンポーネントが含まれます。
  • 実行時に、アセンブリ インターフェイスは、これらのレシピに従って構築されたコンポーネントを返します。

ただし、Typhoon Objective-C と Typhoon Swift には重要な違いがあります。

目的 C:

  • Objective-C では、ビルドされる型を返すようにアセンブリ インターフェイスで宣言することをお勧めします。これにより、コード補完が改善され、不要なキャストが回避されるためです。
  • TyphoonComponentFactoryObjective-C では、アセンブリ インターフェイスの1 つにキャストするだけで、任意のアセンブリ インターフェイスを の前に「ポーズ」させることができます。

迅速:

  • 残念ながら Swift では、アセンブリ メソッドは type を返さなければなりませんAnyObject。Swift の厳密な型チェックでは、それ以外は許可されません。これはSwift のクイック スタート ガイドに示されています。
  • Swift では、 aTyphoonComponentFactoryをアセンブリ インターフェイスの 1 つにキャストすることはできません。ただし、次のようにアセンブリをコンポーネントに挿入することは可能です。

アセンブリの注入:

dynamic func appDelegate() -> AnyObject {
    return TyphoonDefinition.withClass(AppDelegate.self) {
        (definition) in

        //The type of this property can be TyphoonComponentFactory or any of your 
        //assembly interfaces. 
        definition.injectProperty("assembly", with: self)
    }
}

クラッシュの修正:

したがって、上記の条件に従ってクラッシュを修正するには、コードを次のように変更します。

コードを次のように変更します。

public dynamic func loginViewController() -> AnyObject {
    //etc
}

ストーリーボードからのコンポーネントの解決:

plist 統合を使用して Typhoon を開始し、通常のUILaunchStoryboardNameandを含める限り、UIMainStoryboardFileTyphoon はストーリーボードが のインスタンスであることを保証しますTyphoonStoryboard。これは通常のストーリーボードのように機能し、依存関係がアセンブリのルールに従って注入されるという動作が追加されます。

この機能のドキュメントはこちらです。

次の機能はまもなく提供される予定です。

于 2014-11-04T03:06:19.817 に答える
1

私自身の質問に答えるために、また同じ問題を抱えている他の人のために、モジュールが設定されていることを確認し、コンソールログに注意してください。「不明なビューコントローラー」と表示される可能性のあるエラー

ApplicationAssembly では、View Controller を強力な型にキャストしないでください。ドキュメントで引用されているように、AnyObject のままにします。

インターフェイスビルダー

このような素晴らしいフレームワークを作成してくれた Typhoon の作成者に感謝します。

于 2014-11-04T03:03:20.040 に答える