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 中得到纠正。