如何更改我的所有应用程序文本(UILabel,UITableCell .....)颜色?

时间:2011-03-14 21:59:24

标签: objective-c ios4

我想在CSS中做类似的事情而不是“BODY {color:red;}”,但是在客观C中。我的意思是如果我有10个不同的UIView,我想一次改变所有的UIView文本颜色。

干杯

2 个答案:

答案 0 :(得分:0)

简单案例 - 你以某种方式聚集在一起

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]

答案 1 :(得分:0)

你可以用一种很好的方式解决这个问题。这是一个教程

http://dot-ios.blogspot.com/2013/02/design-uilabel-in-optimize-way-for.html