Не уверен насчет наилучшей практики. Но, если ваше приложение недостаточно велико, то ваш друг хорошо структурированный список.
Изначально вы могли выбрать: Metal Theme. Следующее должно иметь место:
У вас либо Синглтон ThemeManager
, либо просто прикрепите NSDictionary
к одному из ваших синглетонов, если необходимо.
Точка позади ThemeManager - это отображение между активом и темой.
Пример кода (написан непосредственно на SOF. Не обращайте внимания на синтаксические ошибки):
#define kThemeMap(__x__) [[ThemeManager sharedManager] assetForCurrentTheme:__x__]
...
-(void)doUselessStuff {
UIImage* backgroundImage = [UIImage imageNamed:kThemeMap(@"FirstViewBG")];
...
}
//in the ThemeManager:
//returns the appropriate name of the asset based on current theme
-(NSString*)assetForCurrentTheme:(NSString*)asset {
//_currentTheme is an NSDictionary initialized from a plist. Plist can be downloaded, too.
NSString* newAsset = [_currentTheme objectForKey:asset];
if(newAsset == nil) {
newAsset = [_defaultTheme objectForKey:asset];
}
return asset;
}
//Let us assume the user selects Metal Theme somewhere .. Still coding ThemeManager:
-(void)selectedNewTheme:(NSString*)newTheme {
//First, get the full path of the resource .. Either The main bundle, or documents directory or elsewhere..
NSString* fullPath = ...;
self.currentTheme = [NSDictionary dictionaryWithContentsOfFile:fullPath];
}
Файлы plist - это просто словарь с отображением строки в строку ... что-то вроде этого:
//Default.plist
@"FirstViewBG" : @"FirstViewBG_Default.png"
@"SecondViewBG" : @"SecondViewBG_Default.png"
@"WinSound" : @"WinSound_Default.aiff"
//Metal.plist
@"FirstViewBG" : @"FirstViewBG_Metal.png"
@"SecondViewBG" : @"SecondViewBG_Metal.png"
@"WinSound" : @"WinSound_Metal.aiff"
В качестве альтернативы, вы можете просто сохранить постфикс, если этого достаточно для вас .. Но для этого потребуется манипулирование строками, разрезав расширение -> добавив постфикс -> добавив расширение.
Или, может быть, сделать его префиксом?