我是 Typhoon 的新手,似乎无法弄清楚如何让我的 Configuration.plist 正确加载。我的项目是以 Swift PocketForecast 示例为模型的,尽管我从我自己的基于 CocoaPods 的项目开始并自己添加了 Typhoon(即我不是从克隆的 PocketForecast 项目开始的)。我正在使用与多个程序集的 plist 集成。
当我使用这个时:
public dynamic func config() -> AnyObject {
return TyphoonDefinition.configDefinitionWithName("Configuration.plist")
}
我收到一个文件未找到错误,在调试器中我可以看到它使用的路径是“/path/to/MyProject.app/Frameworks/Typhoon.framework”,但当然我的配置文件不在那里,它位于在“/path/to/MyProject.app/Configuration.plist”。是的,我已经确认该文件确实存在。
我试图通过执行以下操作来解决此问题:
public dynamic func config() -> AnyObject {
return TyphoonDefinition.withClass(TyphoonConfigPostProcessor.self) {
(definition) in
definition.injectMethod("useResourceAtPath:") {
(method) in
method.injectParameterWith(self.configURL())
}
}
}
public dynamic func configURL() -> AnyObject {
return TyphoonDefinition.withFactory(self.configBundle(), selector: "URLForResource:withExtension:", parameters: {
(initializer) in
initializer.injectParameterWith("Configuration")
initializer.injectParameterWith("plist")
})
}
public dynamic func configBundle() -> AnyObject {
return TyphoonDefinition.withClass(NSBundle.self) {
(definition) in
definition.useInitializer("mainBundle")
}
}
奇怪的是,这有效——有时。它看起来是随机的,并且基于我的其他 Typhoon 程序集的加载顺序。换句话说,有时一切正常,但有时台风初始化会出现各种不同的错误,例如“没有与 id XYZ 匹配的组件”或“在配置中找不到值”。但就像我说的,有时它工作得很好。
我一定错过了台风初始化的一些基本部分,因此非常感谢任何帮助!
编辑:所以经过一番摸索之后,看起来我上面尝试的第一种方法失败了,因为 CocoaPods 使用框架而不是 Swift 项目的静态库的问题?我在 TyphoonResource 中找到了这段代码:
+ (id <TyphoonResource>)withName:(NSString *)name
{
return [self withName:name inBundle:[NSBundle bundleForClass:[self class]]];
}
由于[self class]
将解析为 Typhoon 框架内的一个类,我想我明白为什么它是它正在使用的包,但它对我来说似乎是一个错误。我要看看我是否能弄清楚为什么这不会破坏 PocketForecast 应用程序。