Более краткий способ сделать это в Задаче C? - PullRequest
0 голосов
/ 19 марта 2011

Итак, у меня есть что-то вроде этого в моем коде:

    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 ]

3 голосов
/ 19 марта 2011

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, потому что они думают, что это больше работы или делает их код более сложным для управления;Я думаю, что все наоборот.

2 голосов
/ 20 марта 2011

Кратко, есть слово, которое вы не видите слишком часто в сочетании с Objective-C. Исходя из другого языка, я чувствую твою боль от таких отрывков.

Я прибег к написанию необходимых вариантов надписей один раз, а затем повторяю их много раз. Другие опубликованные ответы - все возможные варианты, хотя я не очень уверен в кратком аргументе. Ответ «LikeLabel» @ Caleb является наиболее универсальным, но вы все равно должны иметь возможность ссылаться на этот другой ярлык.

Я делаю категорию 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.

1 голос
/ 19 марта 2011

Я бы разбил его на функцию, которая устанавливает мои значения.

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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...