2015-03-17 2 views
1

Я новичок в Typhoon и не могу понять, как правильно загрузить мою конфигурацию Configuration.plist. Мой проект моделируется после примера Swift PocketForecast, хотя я начал с моего собственного проекта на основе CocoaPods и сам добавил к нему Typhoon (т. Е. Я не начинал с клонированного проекта PocketForecast). Я использую интеграцию plist с несколькими сборками.TyphoonConfig пытается загрузить 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 запускает множество различных ошибок, таких как «Нет компонента, соответствующий идентификатору XYZ» или «не может найти значение в конфигурации». Но, как я уже сказал, иногда это работает отлично.

Должно быть, мне не хватает фундаментальной части того, как инициализируется тайфун, поэтому любая помощь очень ценится!

Редактировать: Итак, после того, как некоторые из них выглядят так, будто первый метод, который я пробовал выше, терпит неудачу из-за проблемы с CocoaPods, использующей фреймворк вместо статической библиотеки для проектов Swift? Я нашел этот код в TyphoonResource:

+ (id <TyphoonResource>)withName:(NSString *)name 
{ 
    return [self withName:name inBundle:[NSBundle bundleForClass:[self class]]]; 
} 

И так [self class] разрешим к классу в рамках тайфуна, я думаю, я понимаю, почему это расслоение это расслоение он использует, но похоже, ошибка мне. Я посмотрю, смогу ли я понять, почему это не нарушает приложение PocketForecast.

+0

Да, похоже, что вы нашли ошибку. Я думаю, что мы используем '[self class]' там, потому что он использовался для старых тестов логики. , , было бы безопасно (AFAIK) изменить это на '[NSBundle mainBundle]'. Давайте попробуем это. Я буду нажимать на главную ветку, и вы можете 'pod 'Typhoon',: head' –

+0

https://github.com/appsquickly/Typhoon/issues/329 –

+0

Замена с помощью' [NSBundle mainBundle] 'работала для меня. Разрушил ли он другие вещи? – StephenP

ответ

0

Это была ошибка в Typhoon 3.0.1. Как вы указали, когда Typhoon связан как структура Swift, используется неправильный пакет для ресурсов TyphoonConfig. Это было исправлено в Typhoon 3.0.2.

Смежные вопросы