我在教程中提到了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) } } }
如您所见,我想将该程序集注入AppDelegate.
我还在Info.plist文件中添加了typhoonInitialAssemblies条目.在这一刻,我的问题已经开始.我测试了几个导致NSException的组合:
Can’t resolve assembly for name xxx
这种组合是(typhtest是项目/包名称):
> Info.plist中的ClassName:ApplicationAssembly,在Build Settings中定义Module属性:No
> Info.plist中的ClassName:ApplicationAssembly,在Build Settings中定义Module属性:Yes
> Info.plist中的ClassName:typhtest.ApplicationAssembly,在Build Settings中定义Module属性:No
> Info.plist中的ClassName:typhtest.ApplicationAssembly,在Build Settings中定义Module属性:Yes
我在StackOverflow上找到了this的答案,所以我尝试了最后一个组合:
> Info.plist中的ClassName:_TtC8typhtest19ApplicationAssembly,在构建设置中定义模块属性:是
这个组合不会抛出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
2014年11月21日编辑
同样奇怪的是,如果我手动创建工厂并手动注入某些东西,typhoon也可以.我做的步骤是:
>从Info.plist中删除了typhoonInitialAssemblies项
>更改AppDelegate.application(应用程序:UIApplication,didFinishLaunchingWithOptions launchOptions:[NSObject:AnyObject]?) – >布尔来
func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let factory = typhoonBlockComponentFactory(assemblies: [AppAssembly()]) factory.inject(self) return true }
但它没有改变我想在没有手动定义工厂的情况下使用typhoon这一事实,所以问题仍然存在.
解决方法:
在此期间,请通过覆盖AppDelegate中的以下方法来引导typhoon:
dynamic func initialFactory() -> typhoonComponentFactory { return typhoonBlockComponentFactory(assemblies:[ ApplicationAssembly(),AnotherAssemblyIfrequired()]) }
这种方法就像plist-integration一样引导typhoon,因此提供了UIStoryboard集成,UIStateRestoration等等. .直到现在还没有记录,因为我们认为盯着typhoon的plist风格已经足够了,提供太多选择会让人感到困惑.但是在这种情况下,它适用于iOS7.1 Swift Storyboard,而plist则不适用.
命名空间:
至于命名空间问题,没有必要像你一样破坏plist文件中的名称 – typhoon将检测隐式命名空间是否可用并透明地处理它.但是,如果这在iOS7.x中当前不起作用,您可以按如下方式向程序集添加指令:
@objc(ApplicationAssembly) public class ApplicationAssembly : typhoonAssembly { //etc }
编辑:在台风2.3.1中修复:
从typhoon 2.3.1开始,plist bootstrapping现在可以与Swift iOS7.x一起使用