TyphoonConfig 正在尝试使用错误的包路径加载 plist
TyphoonConfig is trying to load plist with wrong bundle path
我是 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 程序集的加载顺序。换句话说,有时一切正常,但有时 Typhoon 初始化会出现各种不同的错误,如 "No component matching id XYZ" 或 "can't find value in config"。但就像我说的,有时它工作得很好。
我一定是遗漏了 Typhoon 初始化的一些基本部分,非常感谢您的帮助!
编辑: 所以经过一番摸索之后,我在上面尝试的第一种方法似乎失败了,因为 CocoaPods 使用框架而不是静态库 Swift 项目?我在 TyphoonResource 中找到了这段代码:
+ (id <TyphoonResource>)withName:(NSString *)name
{
return [self withName:name inBundle:[NSBundle bundleForClass:[self class]]];
}
并且由于 [self class]
将解析为 Typhoon 框架内的 class,我想我明白为什么这是它正在使用的捆绑包,但这似乎是一个错误我。我要看看我是否能弄清楚为什么这不会破坏 PocketForecast 应用程序。
这是 Typhoon 3.0.1 中的错误。正如您所指出的,当 Typhoon 链接为 Swift 框架时,使用了错误的 TyphoonConfig 资源包。这已在台风 3.0.2 中得到纠正。
我是 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 程序集的加载顺序。换句话说,有时一切正常,但有时 Typhoon 初始化会出现各种不同的错误,如 "No component matching id XYZ" 或 "can't find value in config"。但就像我说的,有时它工作得很好。
我一定是遗漏了 Typhoon 初始化的一些基本部分,非常感谢您的帮助!
编辑: 所以经过一番摸索之后,我在上面尝试的第一种方法似乎失败了,因为 CocoaPods 使用框架而不是静态库 Swift 项目?我在 TyphoonResource 中找到了这段代码:
+ (id <TyphoonResource>)withName:(NSString *)name
{
return [self withName:name inBundle:[NSBundle bundleForClass:[self class]]];
}
并且由于 [self class]
将解析为 Typhoon 框架内的 class,我想我明白为什么这是它正在使用的捆绑包,但这似乎是一个错误我。我要看看我是否能弄清楚为什么这不会破坏 PocketForecast 应用程序。
这是 Typhoon 3.0.1 中的错误。正如您所指出的,当 Typhoon 链接为 Swift 框架时,使用了错误的 TyphoonConfig 资源包。这已在台风 3.0.2 中得到纠正。