2009-06-26 15 views
12

w metodzie A UIViewController za viewDidLoad, mogę to zrobić:Dlaczego wyświetlanie tytułu UIButton nie jest wyświetlane?

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); 

przycisk wyświetla ale tytuł nie. Linia NSLog drukuje "Testowanie" na konsoli. Wszelkie sugestie dotyczące tego, co robię źle?

+0

Dwie idee: * Co stanie się, jeśli zwiększysz swój przycisk? * Czy robisz cokolwiek innego w viewDidLoad, które może mieć wpływ na przycisk? – JonathonW

+0

Poniżej znajduje się opis rozwiązania programu deaderikh, ponieważ opisuje on błąd w podwójnym inicjalizatorze użytym powyżej, jak również jego poprawkę, polegającą na przypisaniu ramki osobno, po zakończeniu inicjalizacji wygody [przycisk z typem ...]. Reszta własnego rozwiązania OP jest poprawna i pozostaje taka sama. – eGanges

Odpowiedz

38

Nie mogę powiedzieć, dlaczego to nie działa, ale mam rozwiązanie:

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]; 

indywidualne tworząc ramkę z alokacji i init przycisku.

+0

Zgadzam się. Założę się, że połączenie dwóch inicjalizatorów razem, tak jak robisz, powoduje pewne problemy. Użyj przyciskuWithType, a następnie ustaw ramkę. – LucasTizma

+1

setTitle zrobił to, dzięki – Eugene

+0

Tak, 'buttonWithType' jest statyczną metodą fabryczną, która zwraca w pełni zainicjowany przycisk. Nie można wywołać "initWithFrame" na już zainicjalizowanym przycisku (wynik jest w najlepszym wypadku niezdefiniowany). Metody 'init' są przeznaczone tylko do wywołania po' alloc'. – devios1

4

Czy to zamiast:

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

Problem leży

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

buttonWithType zwraca autoreleased zainicjowany obiekt. Nie można wysłać ponownie initWithFrame, ponieważ obiekt można zainicjować tylko raz.

Ustaw swoją klatkę oddzielnie:

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

Chodzi o to trzeba iść do [[UIButton alloc] initWithFrame:] lub [UIButton buttonWithType:], nie należy używać obu razem.

0

można wykonać następujące czynności:

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

miałem ten sam problem i skończyło się to fakt, że zachodziło obraz zamiast backgroundImage. Wszystko działało dobrze, kiedy to zrobiłem:

[button setBackgroundImage:image forState:UIControlStateNormal]; 
Powiązane problemy