2009-06-26 6 views
12

В методе viewDidLoad UIViewController, я это сделать:Почему не отображается название UIButton?

UIButton *b = [[UIButton buttonWithType:UIButtonTypeRoundedRect] 
             initWithFrame:CGRectMake(0, 0, 100, 100)]; 

[b setTitle:@"Testing" forState:UIControlStateNormal]; 
[b setTitleColor: [UIColor blackColor] forState: UIControlStateNormal]; 
[self.view addSubview:b];      // EDIT: should be 'b' 
NSLog(@"button title: %@", [b titleLabel].text); 

Кнопка выводит на экран, но название не делает. Строка NSLog печатает «Тестирование» на консоли. Любые предложения о том, что я делаю неправильно?

+0

Две идеи: * Что произойдет, если вы сделаете свою кнопку более крупной? * Вы делаете что-нибудь еще в viewDidLoad, которое может повлиять на кнопку? – JonathonW

+0

См. Ниже приведенное ниже решение для умерших, поскольку оно описывает ошибку в двойном инициализаторе, использованном выше, а также исправление для него, которое должно назначать кадр отдельно после завершения инициализации удобства [... с типом ...]. Остальная часть собственного решения OP правильная и остается неизменной. – eGanges

ответ

38

Я не могу сказать вам, почему это не работает, но у меня есть решение:

UIButton *b = [UIButton buttonWithType:UIButtonTypeRoundedRect] ;   
b. frame = CGRectMake(0, 0, 100, 100); 

[b setTitle:@"Testing" forState:UIControlStateNormal]; 
[b setTitleColor: [UIColor blackColor] forState: UIControlStateNormal]; 
[self addSubview:b]; 

Seperate создавая кадр из распределения и инициализации кнопки.

+0

Согласен. Я уверен, что объединение двух инициализаторов вместе, как вы делаете, вызывает некоторые проблемы. Используйте buttonWithType, затем установите фрейм. – LucasTizma

+1

setTitle сделал это, спасибо – Eugene

+0

Да, 'buttonWithType' - это статический заводский метод, который возвращает полностью инициализированную кнопку. Вы не можете вызывать 'initWithFrame' на уже инициализированной кнопке (результат в лучшем случае не определен). Методы 'init' предназначены только для вызова после' alloc'. – devios1

4

ли это вместо:

UIButton *b = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
b.frame = CGRectMake(0, 0, 100, 100); 
[b setTitle:@"Testing" forState:UIControlStateNormal]; 
[b setTitleColor: [UIColor blackColor] forState: UIControlStateNormal]; 
[self.view addSubview:b]; 
22

Проблема заключается

UIButton *b = [[UIButton buttonWithType:UIButtonTypeRoundedRect] 
             initWithFrame:CGRectMake(0, 0, 100, 100)]; 

buttonWithType возвращает autoreleased инициализирован объект. Вы не можете отправить его initWithFrame снова, поскольку объект может быть инициализирован только один раз.

Установите его рамку отдельно:

b.frame = CGRectMake(0, 0, 100, 100); 
0

Дело в том, что вам нужно пойти на [[UIButton alloc] initWithFrame:] или [UIButton buttonWithType:], вы не должны использовать оба вместе.

0

Вы можете сделать следующее:

UIButton *b=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; 

b=[UIButton buttonWithType:UIButtonTypeRoundedRect];

[b setTitle:@"Button Title Here" forState:UIControlStateNormal]; 
[b setTitleColor:[UIColor blackColor] forState: UIControlStateNormal]; 
[self.view addSubview:b]; 
0

У меня была такая же проблема, и это закончилось тем, что тот факт, что я устанавливало изображение, а не BackgroundImage. Все было хорошо, когда я это сделал:

[button setBackgroundImage:image forState:UIControlStateNormal]; 

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

  • Нет связанных вопросов^_^