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 中,我们建议您的程序集接口声明返回将要构建的类型,因为这提供了更好的代码完成并避免了不必要的强制转换。
  • 在 Objective-C 中,您可以将任何汇编接口“摆在”前面,TyphoonComponentFactory只需将其转换为您的一个汇编接口即可。

迅速:

  • 不幸的是,在 Swift 中,你的汇编方法必须返回 type AnyObject。Swift 的严格类型检查不允许其他情况。这显示在Swift 的快速入门指南中
  • 在 Swift 中,不可能将 a 强制转换TyphoonComponentFactory为一个程序集接口。但是,仍然可以将程序集注入到组件中,如下所示:

注入组件:

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 UIMainStoryboardFile,那么 Typhoon 将确保您的故事板是 的一个实例TyphoonStoryboard,这就像一个普通的故事板一样,具有根据您的程序集中的规则注入依赖项的附加行为。

此功能的文档在此处

以下功能即将推出:

于 2014-11-04T03:06:19.817 回答
1

要回答我自己的问题以及其他有相同问题的人,请确保您的模块已设置并仔细注意控制台日志,任何可能显示“未知视图控制器”的错误

在您的 ApplicationAssembly 中,不要将视图控制器转换为强类型,将其保留为文档中引用的 AnyObject。

界面生成器

感谢 Typhoon 的作者编写了如此出色的框架!

于 2014-11-04T03:03:20.040 回答