2009-06-26 18 views
12

In einem viewDidLoad Methode des UIViewController, ich dies tun:Warum wird der UIButton-Titel nicht angezeigt?

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

Die Taste zeigt aber der Titel nicht. Die NSLog-Zeile druckt "Testing" auf die Konsole. Irgendwelche Vorschläge, was ich falsch mache?

+0

Zwei Ideen: * Was passiert, wenn Sie Ihren Knopf größer machen? * Haben Sie etwas anderes in ViewDidLoad, das die Schaltfläche beeinflussen könnte? – JonathonW

+0

Bitte lesen Sie die Lösung von Diederikh unten, da sie einen Fehler in dem oben verwendeten Doppelinitialisierer sowie die Korrektur dafür beschreibt, nämlich den Rahmen separat zuzuweisen, nachdem der Komfortinitialisierer [... mit Typ ...] abgeschlossen ist. Der Rest der eigenen Lösung des OP ist korrekt und bleibt gleich. – eGanges

Antwort

38

Ich kann Ihnen nicht sagen, warum es nicht funktioniert, aber ich habe eine Lösung haben:

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 den Rahmen aus der Verteilung und init der Taste erzeugt wird.

+0

Ich stimme zu. Ich wette, dass es zwei Probleme hat, zwei Initialisierer zu verketten, wie Sie es tun. Verwende den buttonWithType und setze den Rahmen. – LucasTizma

+1

setTitle hat es geschafft, danke – Eugene

+0

Ja, 'buttonWithType' ist eine statische Factory-Methode, die eine vollständig initialisierte Schaltfläche zurückgibt. Sie können 'initWithFrame' nicht auf einer bereits initialisierten Schaltfläche aufrufen (das Ergebnis ist bestenfalls undefiniert). 'init'-Methoden sollen nur nach' alloc' aufgerufen werden. – devios1

4

Tun Sie dies statt:

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

Das Problem liegt bei

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

buttonWithType gibt ein Autoreleased initialisiert Objekt. Sie können ihm kein initWithFrame erneut senden, da ein Objekt nur einmal initialisiert werden kann.

Set seinen Rahmen separat:

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

Die Sache ist, dass Sie für [[UIButton alloc] initWithFrame:] oder [UIButton buttonWithType:] gehen, sollten Sie beide nicht zusammen verwenden.

0

Sie können folgendes tun:

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

ich hatte das gleiche Problem und es war dann aber die Tatsache, dass ich das Bild einstellte anstatt die Background. Alles funktionierte gut, als ich es tat:

[button setBackgroundImage:image forState:UIControlStateNormal]; 
Verwandte Themen