2009-06-26 8 views
12

Dans une méthode viewDidLoad UIViewController, je fais ceci:Pourquoi le titre UIButton n'apparaît-il pas?

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

Le bouton affiche, mais le titre ne fonctionne pas. La ligne NSLog imprime "Testing" sur la console. Des suggestions sur ce que je fais mal?

+0

Deux idées: * Que se passe-t-il si vous agrandissez votre bouton? * Faites-vous autre chose dans viewDidLoad qui pourrait affecter le bouton? – JonathonW

+0

Veuillez voir la solution de diederikh ci-dessous car elle décrit une erreur dans l'initialisateur double utilisé ci-dessus ainsi que le correctif qui consiste à assigner la trame séparément, après que l'initialiseur de commodité [... avec le type ...] soit terminé. Le reste de la propre solution de l'OP est correct et reste le même. – eGanges

Répondre

38

Je ne peux pas vous dire pourquoi cela ne fonctionne pas, mais j'ai une solution:

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

créer le cadre Separate de l'allocation et init du bouton.

+0

Je suis d'accord. Je parie que chaîner deux initialiseurs ensemble comme vous le faites cause quelques problèmes. Utilisez le buttonWithType puis définissez le cadre. – LucasTizma

+1

setTitle l'a fait, merci – Eugene

+0

Oui, 'buttonWithType' est une méthode d'usine statique qui retourne un bouton entièrement initialisé. Vous ne pouvez pas appeler 'initWithFrame' sur un bouton déjà initialisé (le résultat est au mieux indéfini). Les méthodes 'init' sont uniquement destinées à être appelées après' alloc'. – devios1

4

Pour ce faire, à la place:

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

Le problème réside

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

buttonWithType retourne un objet initialisé autoreleased. Vous ne pouvez pas lui envoyer à nouveau initWithFrame car un objet ne peut être initialisé qu'une seule fois.

Définir son cadre séparément:

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

La chose est que vous devez aller pour [[UIButton alloc] initWithFrame:] ou [UIButton buttonWithType:], vous ne devriez pas utiliser les deux ensemble.

0

Vous pouvez effectuer les opérations suivantes:

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

J'ai eu le même problème et il a fini par être le fait que je mettais l'image plutôt que la backgroundImage. Tout a bien fonctionné quand je l'ai fait:

[button setBackgroundImage:image forState:UIControlStateNormal];