重复使用UILabel风格的正确方法是什么?

时间:2011-07-01 00:16:29

标签: iphone ios objective-c uilabel

我有几个UILabel s具有相同的视觉处理。我不是每次都重新定义每一个属性,而是考虑复制一个实例并更改文本。这是怎么做的?

另一种方法是创建一个工厂方法,但我不喜欢这个想法。

2 个答案:

答案 0 :(得分:6)

如果你愿意学习Three20,你可以使用TTLabel类,它与Three20的样式表系统结合在一起,它基本上是为解决你的问题而设计的。但是,我个人在解析Three20的所谓文档方面遇到了麻烦,所以我认为学习使用这个库来解决你的问题需要大量的开销。

我解决这个问题的方法是组建一个迷你工厂方法,如下所示:

// Example:
- (UILabel *)makeLabel {
  UILabel *label = [[[UILabel alloc] init] autorelease];
  label.backgroundColor = [UIColor clearColor];
  label.font = [UIFont systemFontOfSize:kMyFontSize];
  label.textColor = [UIColor blueColor];
  label.textAlignment = UITextAlignmentCenter;
  [self.view addSubview:label];
  return label;
}

然后,当我使用此方法时,其他代码变得更清晰:

UILabel *nameLabel = [self makeLabel];
nameLabel.text = userName;
UILabel *titleLabel = [self makeLabel];
titleLable.text = myTitle;
// Both labels have consistent style.

PengOne建议继承UILabel。这是一个选择,虽然我认为这种工厂方法能够以较少的工作完成工作。

答案 1 :(得分:0)

您似乎希望子类化UILabel,以便默认为您的首选项。这很简单。在Xcode(和Objective C Class)中创建一个名为CustomLabel(或任何你喜欢的)的新文件。

CustomLabel.m:

#import <UIKit/UIKit.h>

@interface CustomLabel : UILabel {
}

@end

CustomLabel.h:

#import "CustomLabel.h"

@implementation CustomLabel

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        // CUSTOMIZATION HERE
    }
    return self;
}

- (void)dealloc {
    [super dealloc];
} 

@end

如果这看起来有点矫枉过正,那么您可以在ViewController中创建一个方法来进行自定义:

-(void)customizeLabel:(UILabel *)label {
    // CUSTOMIZATION HERE
}

然后在您创建的任何标签上调用它。