使用Typhoon和Swift从故事板中注入视图控制器

时间:2014-11-04 02:19:04

标签: swift storyboard uistoryboard typhoon

使用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动态演员失败"让我相信使用Swift使用Objective C是不可能的。

有没有人能够做到这一点?任何帮助将不胜感激。该库看起来非常好,我真的很想使用它。

2 个答案:

答案 0 :(得分:3)

以下规则适用于Swift和Objective-C中使用Typhoon:

  • 在构建时,您的程序集接口会返回用于组装对象实例的配方。这包括配置以及任何协作组件。
  • 在运行时,程序集界面返回根据这些配方构建的组件。

然而,Typhoon Objective-C和Typhoon Swift之间存在重要区别:

<强>目标-C:

  • 在Objective-C中,我们建议您的程序集接口声明返回将构建的类型,因为这样可以提供更好的代码完成并避免不必要的转换。
  • 在Objective-C中,您可以拥有任何组装界面&#39; pose&#39;在TyphoonComponentFactory前面,只需将其转换为一个程序集界面即可。

<强>夫特:

  • 不幸的是,在Swift中,汇编方法必须返回类型AnyObject。斯威夫特的严格类型检查不会允许。这显示在Quick Start guide for Swift中。
  • 在Swift中,不可能将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 integration启动Typhoon并包含通常的UILaunchStoryboardNameUIMainStoryboardFile,Typhoon就会确保您的故事板是TyphoonStoryboard的实例,这就像一个普通的故事板,其中添加了依赖项根据程序集中的规则注入的行为。

此功能的文档是here

以下功能即将推出:

答案 1 :(得分:1)

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

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

Interface Builder

感谢Typhoon的作者撰写了这样一个非常棒的框架!