【问题标题】:Injecting a view controller from a storyboard using Typhoon and Swift使用 Typhoon 和 Swift 从情节提要中注入视图控制器
【发布时间】:2014-11-04 13:37:41
【问题描述】:

使用 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 时是不可能的。

有没有人能够完成这项工作?任何帮助将不胜感激。这个库看起来很不错,我真的很想使用它。

【问题讨论】:

    标签: swift storyboard uistoryboard typhoon


    【解决方案1】:

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

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

    但是 Typhoon Objective-C 和 Typhoon Swift 之间有一个重要的区别:

    目标-C:

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

    斯威夫特:

    • 不幸的是,在 Swift 中,您的汇编方法必须返回类型 AnyObject。 Swift 的严格类型检查不允许其他情况。这显示在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

    即将推出以下功能:

    【讨论】:

    • 感谢您的详细回答,非常感谢您抽出宝贵时间回复。现在更有意义了。肯定会用台风,好东西!
    • @JasperBlues 是否已经有一些 Swift+Storyboard 示例代码可用?
    • @riik 恐怕不会。但它像 ObjC 一样工作,除了您必须显式连接之外,ObjC 自动注入宏不可用。 . .如果有人可以创建样本,我们会很高兴。
    • 感谢您的回答,它真的帮助了我(作为一个迅捷和台风的新手)。我使用情节提要创建了示例项目,除了将 ViewModel 的台风注入到主视图控制器之外什么都不做。 github.com/tkach/Typhoon-Swift-Storyboard-Sample
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢@Vincil!我们很高兴您喜欢台风
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2017-07-08
    • 2016-01-01
    • 2014-02-17
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多