我在Swift项目中遇到Typhoon Framework 2.3.0版的烦人问题。

如教程中所述,我在Podfile中包括了Typhoon,安装了Pods,创建了桥接头,并在此头中添加了#import <Typhoon/Typhoon.h>

然后,我创建了名为ApplicationAssebly的程序集子类:

import Foundation

public class ApplicationAssembly: TyphoonAssembly {
    public dynamic func appDelegate() -> AnyObject {
        return TyphoonDefinition.withClass(AppDelegate.self) {
            (definition) in
            definition.injectProperty("myAssembly", with: self)
        }
    }
}

如您所见,我想将该程序集注入(inject)AppDelegate。
我还在Info.plist文件中添加了TyphoonInitialAssemblies条目。在这一刻,我的问题开始了。我测试了导致NSException的几种组合:



这些组合是(typhtest是项目/ bundle 名称):

Info.plist中的
  • 类名: ApplicationAssembly ,在“构 build 置”中定义Module属性:
  • Info.plist中的
  • 类名: ApplicationAssembly ,在“构 build 置”中定义Module属性:
  • Info.plist中的
  • 类名: typhtest.ApplicationAssembly ,在“构 build 置”中定义Module属性:
  • Info.plist中的
  • 类名: typhtest.ApplicationAssembly ,在“构 build 置”中定义Module属性:

  • 我在StackOverflow上找到了this答案,所以我尝试了最后一种组合:

    Info.plist中的
  • 类名: _TtC8typhtest19ApplicationAssembly ,在“构 build 置”中定义Module属性:

  • 这种组合不会引发NSException,但是我有 dyld_fatal_error ,来自下面的iPhone 5s(iOS 7.1)的堆栈跟踪:

    我从iPhone模拟器(iOS 7.1)得到了稍微不同的堆栈跟踪:

    它在iOS 8.1模拟器上工作的奇怪之处在于! Typhoon Sample Application for Swift也可以在我的设备上正常运行。

    我还尝试清理任何Xcode和项目缓存以及DerivedData目录,清理了项目并构建了文件夹,然后重新构建了项目,但是它不起作用。我的Xcode版本是6.1(6A1052d),我正在使用OSX Yosemite 10.10.1。

    带有我的代码的GitHub存储库:https://github.com/papcio28/Typhoon-Dyld-Error

    编辑日期21.11.2014

    同样奇怪的是,如果我手动创建工厂并手动注入(inject)某些东西,台风也可以工作。我已经完成的步骤是:
  • 从Info.plist
  • 中删除了TyphoonInitialAssemblies
  • AppDelegate.application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool更改为
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let factory = TyphoonBlockComponentFactory(assemblies: [AppAssembly()])
        factory.inject(self)
        return true
    }
    

  • 但这并没有改变我想要在不手动定义工厂的情况下使用Typhoon的事实,因此问题仍然存在。

    最佳答案

    该问题已被复制as a bug,并将尽快解决。它也已在Typton示例应用程序中pod update之后进行了复制,与此同时,干净的 checkout 效果很好。这表明回归错误已潜伏在2.2.1和2.3.0之间的某个位置,但是检查此错误会产生一些奇怪的结果,因此实际上并非如此。我们会将更新/发现发布到问题日志中。

    解决方法:

    同时,请在您的AppDelegate中重写以下方法来引导台风:

    dynamic func initialFactory() -> TyphoonComponentFactory {
    
        return TyphoonBlockComponentFactory(assemblies:[
            ApplicationAssembly(),
            AnotherAssemblyIfRequired()])
    }
    

    这种方法就像plist-integration一样引导Typhoon,因此提供UIStoryboard集成,UIStateRestoration等。 。直到现在为止,它都没有被记录下来,因为我们认为凝视台风的浮雕风格就足够了,提供太多选择会很容易混淆。但是在这种情况下,它适用于iOS7.1 + Swift + Storyboards,而plist则无效。

    namespace :

    至于 namespace 问题,没有必要像以前那样处理plist文件中的名称-台风将检测隐式 namespace 是否可用,并进行透明处理。但是,如果当前在iOS7.x中不起作用,则可以向程序集中添加指令,如下所示:
    @objc(ApplicationAssembly)
    public class ApplicationAssembly : TyphoonAssembly {
        //etc
    }
    

    编辑:台风2.3.1中已修复:

    从Typhoon 2.3.1开始,plist引导现在可以与Swift + iOS7.x一起使用

    07-28 01:39