Простой случай - вы как-то собрали их вместе
for (UIView *v in styledViews) {
// apply current style here
}
Я сомневаюсь, что это ваш случай
Сложный случай - везде множество тонных стилевых представлений.
Отказ от ответственности: я ничего не могу гарантировать относительно следующего кода, он работает на моем симуляторе, что не означает, что он не взорвется в руках пользователя. Я написал это, потому что это было весело и может помочь Томасу решить его проблему. Я не проверил документацию полностью, потому что здесь уже 5 часов утра
1) Инкапсулирует стиль в некоторый класс StyleManager
(в этом примере applyCurrentStyle:
будет применять текущий стиль к любому передаваемому представлению). Он должен публиковать уведомления каждый раз, когда меняется стиль (например, kStyleManagerNotificationStyleChanged)
2) Создайте категорию UIView
(например, UIView+Style
) публичным методом setStyleManager:
.
3) Реализовать это:
#import "UIView+Style.h"
#import <objc/runtime.h>
@interface StyleSubscription : NSObject {
StyleManager *styleManager;
NSObject *subscriber;
}
@property (readonly) StyleManager *styleManager;
- (id)initWithStyleManager:(NSObject*)p subscriber:(NSObject*)s;
@end
@implementation StyleSubscription
@synthesize styleManager;
- (id)initWithStyleManager:(StyleManager*)sManager subscriber:(NSObject*)s {
if (self = [super init]) {
styleManager = [sManager retain];
subscriber = s;
}
return self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:subscriber
name:kStyleManagerNotificationStyleChanged
object:styleManager];
[styleManager release];
[super dealloc];
}
@end
@implementation UIView (Style)
static char styleSubsriptionKey;
- (StyleManager*)styleManager {
StyleSubscription *s = objc_getAssociatedObject(self, &styleSubsriptionKey);
return s.styleManager;
}
- (void)styleChanged:(NSNotification*)n {
[[self styleManager] applyCurrentStyle:self];
}
- (void)setStyleManager:(StyleManager*)sManager {
if ([self styleManager] == sManager) {
return;
}
StyleSubscription *subscr = nil;
if (sManager != nil) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(styleChanged:)
name:kStyleManagerNotificationStyleChanged
object:sManager];
subscr = [[[StyleSubscription alloc] initWithStyleManager:sManager
subscriber:self] autorelease];
}
objc_setAssociatedObject(self, &styleSubsriptionKey, subscr, OBJC_ASSOCIATION_RETAIN);
[sManager applyCurrentStyle:self];
}
@end
Каждый раз, когда менеджер стиля публикует уведомления, соответствующие представления будут обновляться новым стилем. View будет отписываться от уведомлений о стиле автоматически после освобождения. Менеджер стилей может быть удален явно [view setStyleManager:nil]
.