2013-09-25 6 views
1

У меня есть куча UILabels, которые должны быть настроены одинаково, но с разными кадрами. Поскольку существует много из них я думал, что уменьшить количество кода, сделав функцию, чтобы сделать это:Инициализировать переменную экземпляра с помощью функции

-(void)addField:(UILabel *)label withFrame:(CGRect)frame toView:(id)view { 
    label = [[UILabel alloc] initWithFrame:frame]; 
    label.layer.cornerRadius = 3; 
    [view addSubview:label]; 
} 

и вызвать его с помощью:

[self addField:fieldOneLabel withFrame:CGRectMake(20, 180, 61, 53) toView:theView]; 

Это работает до такой степени, что поля отображаются правильно, но, глядя в него fieldOneLabel, не инициализируется, так что там больше нет ссылки UILabel. Я думал, что мне, возможно, придется использовать &, но я думаю, что мое понимание неверно, поскольку оно вызывает ошибки компилятора. Что мне делать?

+0

Какие ошибки компилятора вы получаете? –

+0

Передача адреса нелокального объекта в параметр __autoreleasing для обратной записи – Rudiger

ответ

0

Я изменил его не отправить UILabel к функции, но вернуть метку, созданную:

-(UILabel *)addFieldWithFrame:(CGRect)frame toView:(id)view { 
    UILabel *label = [[UILabel alloc] initWithFrame:frame]; 
    label.layer.cornerRadius = 3; 
    [view addSubview:label]; 
    return label; 
} 

И позвонил через:

fieldOneLabel = [self addFieldWithFrame:CGRectMake(self.view.bounds.size.width/2 - 128, 13, 61, 53) toView:view]; 

Хотя похоже на Sco Ответ tts Я хотел бы не добавлять представление в другую строку.

3

Вы можете вернуть метку, а затем добавить его в UIView больше, как это:

-(UILabel*)createLabelWithText:(NSString*)text andFrame:(CGRect)frame { 
    UILabel *label = [[UILabel alloc] initWithFrame:frame]; 
    [label setText:text]; 
    label.layer.cornerRadius = 3; 
    return label; 
} 

Затем в коде вы можете сделать следующее:

UILabel *xLabel = [self createLabelWithText:@"Some Text" andFrame:CGRectMake(20, 180, 61, 53)]; 
[theView addSubview:xLabel]; 

или если вы хотите доступ к нему позже как свойство:

self.xLabel = [self createLabelWithText:@"Some Text" andFrame:CGRectMake(20, 180, 61, 53)]; 
[theView addSubview:xLabel]; 
+0

Я бы переименовал этот метод из addFieldWithFrame, поскольку он больше не добавляет это поле в представление. Лучшим решением было бы сделать категорию для UILabel с фреймом method + labelWithFrame: (CGRect). –

+0

Я рад использовать это, но возможно ли это сделать так, как я это делаю сейчас? – Rudiger

1
-(void)addField:(UILabel * __autoreleasing *)fieldOneLabel withFrame:(CGRect)frame toView:(id)view { 
    if (fieldOneLabel != nil) { 
     *fieldOneLabel = [[UILabel alloc] initWithFrame:frame]; 
     (*fieldOneLabel).layer.cornerRadius = 3; 
     [view addSubview:(*fieldOneLabel)]; 
    } 
} 

и вызвать его с помощью:

[self addField:&fieldOneLabel withFrame:CGRectMake(20, 180, 61, 53) toView:theView]; 

использование __autoreleasing избежать дуги проблема памяти

+0

У меня было довольно близко к этому, но оно давало ошибку. Передача адреса нелокального объекта в параметр __autoreleasing для обратной записи. Есть предположения? – Rudiger

+0

У меня такое чувство, что это невозможно в ARC? – Rudiger

+0

Ошибка сборки или ошибка анализа при построении с помощью xcode5 с поддержкой дуги, поэтому я думаю, что нет дуговой проблемы – lanbo

Смежные вопросы