在Objective C中更简洁的方法吗?

时间:2011-03-19 06:26:29

标签: objective-c cocoa-touch coding-style

所以我的代码中有这样的东西:

    leftMostLabel = [[UILabel alloc] initWithFrame:CGRectMake(60.0f, 2.0f, 80.0f, 40.0f)];
    leftMostLabel.text = @"Some text";
    leftMostLabel.textColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    leftMostLabel.backgroundColor = [UIColor clearColor];
    leftMostLabel.textAlignment = UITextAlignmentCenter;
    leftMostLabel.font = [UIFont boldSystemFontOfSize:13.0];
    leftMostLabel.userInteractionEnabled = NO;

    centerLeftLabel = [[UILabel alloc] initWithFrame:CGRectMake(115.0f, 2.0f, 80.0f, 40.0f)];
    centerLeftLabel.text = currentDate;
    centerLeftLabel.textColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    centerLeftLabel.backgroundColor = [UIColor clearColor];
    centerLeftLabel.textAlignment = UITextAlignmentCenter;
    centerLeftLabel.font = [UIFont systemFontOfSize:12.0];
    centerLeftLabel.userInteractionEnabled = NO;

哪个工作正常,花花公子,但我多次重复这种格式。理想情况下,我希望将变量(leftMostLabel,centerLeftLabel等)传递给一个函数,该函数根据我传递给它的名称在幕后为我创建标签,如以及我喂它的任何附加参数。这可能吗?如果是这样,我将如何解决这个问题?

提前致谢!

3 个答案:

答案 0 :(得分:3)

Objective-C提供了通过类别扩展现有类的可能性,因此您可以轻松地向UILabel添加方法,例如:+labelWithFrame:text:textColor:backgroundColor:alignment:font:interaction:。这会缩短一点,所以你的代码看起来像:

UILabel *leftLabel = [UILabel labelWithFrame:CGRectMake(...)
                                        text:@"Yoo hoo!"
                                   textColor:[UIColor blueColor]
                             backgroundColor:[UIColor clearColor]
                               textAlignment:UITextAlignmentLeft
                                        font:[UIFont systemFontOfSize:12];
                      userInteractionEnabled:NO];

这看起来有点混乱,可能是值得的。

如果您的大多数标签相似,则另一个选项是添加使用原型创建标签的方法。 UIView不实现NSCopying,因此您不能使用-copy方法复制标签,但您可以编写一个方法来创建新标签并根据现有标签对其进行配置。调用它可能看起来像:

UILabel *centerLabel = [UILabel labelWithFrame:CGRectMake(...)
                                     likeLabel:leftLabel];
centerLabel.text = @"Hey there!";

最后,考虑使用Interface Builder创建所有这些标签。 Cocoa和Cocoa Touch代码将充满调用查看配置方法,如-initWithFrame:和-addSubview:如果不是IB。它可能适用于您的情况,也可能不适合,但有时人们会避免使用IB,因为他们认为这样做更多,或者使代码更难以管理;我认为情况恰恰相反。

答案 1 :(得分:2)

简明扼要地说,有一个词你不会经常与Objective-C一起看到。来自另一种语言,我觉得你的痛苦就像这些片段一样。

我曾经尝试过编写必要的标签变体,然后重复多次。其他发布的答案都是可行的选择,虽然我不太确定简明的论点。 @Caleb的'likeLabel'答案是最通用的,但你仍然需要能够引用其他标签。

我在UILabel上制作了一个特定于项目的类别,并将各种标签放在我自己的位置。我唯一能为每个标签重复的是框架和文字。将+方法放在一个类别中并不是很有必要,但UILabel确实总结了你想要的东西。在确定了类别后,您就可以使用它了:

UILabel *someLabel = [UILabel headerLabelWithFrame:CGRectMake(10, 10, 256, 32) andText:@"Conciseness"];

这就是只有一种标签类型的类别。如果需要,你可以添加更多:

@interface UILabel (ProjectSpecificLabels)
+(UILabel *)headerLabelWithFrame:(CGRect)frame andText:(NSString *)text;
@end

@implementation UILabel (ProjectSpecificLabels)
+(UILabel *)headerLabelWithFrame:(CGRect)frame andText:(NSString *)text {
  UILabel *label = [[[self alloc] initWithFrame:frame] autorelease];
  label.text = text;
  label.textColor = [UIColor colorWithWhite:1.0 alpha:1.0];
  label.backgroundColor = [UIColor clearColor];
  label.textAlignment = UITextAlignmentCenter;
  label.font = [UIFont boldSystemFontOfSize:13.0];
  label.userInteractionEnabled = NO;
  return label;
}
@end

希望它有所帮助。
干杯, EP。

答案 2 :(得分:1)

我会把它分解成一个设置我的值的函数。

leftMostLabel = [[UILabel alloc] initWithFrame:CGRectMake(60.0f, 2.0f, 80.0f, 40.0f)];
leftMostLabel.text = @"Some text";
[self initLabelValues:leftMostLabel withFont:[UIFont boldSystemFontOfSize:13.0]];

centerLeftLabel = [[UILabel alloc] initWithFrame:CGRectMake(115.0f, 2.0f, 80.0f, 40.0f)];
centerLeftLabel.text = currentDate;
[self initLabelValues:centerLeftLabel withFont:[UIFont boldSystemFontOfSize:12.0]];

-(void) initLabelValues:(UILabel*)inLabel withFont:(UIFont*)font {

    [inLabel setTextColor:[UIColor colorWithWhite:1.0 alpha:1.0]];
    [inLabel setBackgroundColor:[UIColor clearColor]];
    [inLabel setTextAlignment:UITextAlignmentCenter];
    [inLabel setUserInteractionEnabled:NO];

    [inLabel setFont:font];
}