2010-08-06 8 views
-2

Voici un code avec lequel j'ai joué; pour une raison quelconque, je n'arrive pas à créer un seul bouton à la fois. Par exemple vous avez; pour (i = 1; i < = 12; i ++) devrait signifier que pour chaque fois qu'un bouton externe est enfoncé, un nouveau est créé jusqu'à ce que 12 boutons aient été créés. Alors il devrait y avoir un i = 12; Cependant, je n'arrive pas à faire fonctionner cette boucle. Toute assistance sera grandement appréciée.Un UIButton à la fois

// Où placer le bouton sur l'axe Y sur la position de l'écran float startPositionY = 70.0;

for(int i = 1; i <= 4; i++) { 

    NSString *button = [NSString stringWithFormat:@"button%i", i]; 

     // NSMutableString version to keep button from changing name. 
     //NSString *button = [NSMutableString stringWithFormat:@"button%i", i]; 

    UIButton *tempBName = (UIButton *)[UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [tempBName setTitle:button forState:UIControlStateNormal]; 
    tempBName.tag = i; 
    [tempBName addTarget:self action:@selector(clickMe:)forControlEvents:UIControlEventTouchUpInside]; 
    tempBName.frame = CGRectMake(0.0, 0.0, 80.0, 50.0); 
    tempBName.center = CGPointMake(160.0, 50.0+startPositionY); 
    tempBName.titleLabel.adjustsFontSizeToFitWidth = TRUE; 
    [self.view addSubview:tempBName]; 

     // Make space between each button 
    startPositionY += 70; 

     // How many buttons out of "i" are we creating? 
    NSLog(@"%d", i); 

     // release button 
    [button release]; 
} 
    // Was the button Pressed? 
NSLog(@"Did Press"); 
    // Did our Position change on the Y-axis? 
NSLog(@"%f", startPositionY); 

Merci,

+0

Tout d'abord, pas besoin de relâcher 'button', il n'y a pas alloc, new ou copy. Donc ce que vous voyez ou ne voyez pas? – Pablo

Répondre

0

Vous êtes sur libérant chaque bouton, faisant disparaître de la vue. Lorsque vous créez le bouton avec [UIButton buttonWithType ...], il est ajouté au pool autorelease et vous n'en avez pas la propriété. Lorsque vous l'ajoutez à la vue, son nombre de réceptions est incrémenté de 1, ce qui vous donne la propriété, mais vous le relâchez ensuite avec [relâcher le bouton]. Retirez la ligne [release] et tout devrait bien se passer.

Je vous recommande fortement de lire le Guide de programmation de gestion de la mémoire d'Apple.

J'ai réécrit votre code en déplaçant la création de bouton dans une méthode que vous devez appeler chaque fois que vous cliquez sur le bouton d'ajout. Vous devrez également déclarer une variable NSInteger appelée buttonCount dans votre fichier d'en-tête (.h).

- (void)addButton { 

     if (buttonCount == 4) return; 
     buttonCount += 1; 

     UIButton *tempBName = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     [tempBName setTitle:[NSString stringWithFormat:@"button%i", buttonCount]; forState:UIControlStateNormal]; 
     tempBName.tag = buttonCount; 
     [tempBName addTarget:self action:@selector(clickMe:)forControlEvents:UIControlEventTouchUpInside]; 
     tempBName.frame = CGRectMake(0.0, 50.0+(startPositionY*buttonCount)), 80.0, 50.0); 
     // Removed the line setting the center, and move the positioning to the frame above 
     tempBName.titleLabel.adjustsFontSizeToFitWidth = TRUE; 
     [self.view addSubview:tempBName]; 
    } 
+0

Salut, Merci pour votre avis - Je vais vérifier la ressource Apple, Cependant, oui, le code me donnera 4 boutons en même temps. Mais je ne peux pas obtenir 1 bouton à la fois. C'est ce que j'essaie de faire. Il devrait y avoir un moyen de générer 1 bouton par clickMe. – nepfable

+0

pourquoi ne pas simplement changer le i <= 4 à i <= 1? – RunLoop

+0

J'ai essayé ça au début. N'a pas fonctionné. Juste fait un bouton et arrêté. Chose est que cela devrait être un type de C itération. Démarrage du programme pas de bouton - AddItem "+" génère sur le bouton. AddItem "+" génère le 2ème bouton ... mais je ne comprends pas. [nombre = 0; pour (;;) if (count == 4) break; NSLog (@ "count", count)] ou quelque chose comme ça. – nepfable

1

Pourquoi ne supprimez-vous pas simplement la boucle for? Si vous voulez seulement un bouton, et non pas quatre, il n'y a aucune raison d'exécuter le code quatre fois ...

+0

Bien sûr, je veux lancer la boucle for à MAX NUMBER, c'est-à-dire i <= 4. Pour générer chacun des 4 boutons un à la fois. J'avais l'habitude d'avoir une pause; et "==", mais ils ne semblaient pas avoir d'effet. J'ai essayé d'utiliser ARRAY, mais ça n'a pas marché non plus. – nepfable

+1

Vous ne comprenez pas à quoi sert une boucle 'for'. Une boucle 'for' va répéter autant de fois que demandé sans s'arrêter (à moins qu'on lui demande de faire une pause, mais cela arrêtera l'exécution de la boucle, pas de pause pour l'entrée de l'utilisateur). Regardez la réponse de Run Loop. C'est ce que vous voulez, et n'utilise pas la boucle 'for', comme je l'ai suggéré. – Jasarien

+0

Merci et vous avez raison. Je me suis corrigé mon ami. – nepfable

0

Eh bien, ça a bien marché, je me sens si bête. Je l'ai presque eu hier et j'ai laissé tomber la balle. Donc, juste pour récapituler ici est le code complet final pour tout le monde là-bas:

Que fait ce code? Il permet la création d'un seul bouton par clic.

[fichier h]:

@interface testMButton1ViewController : UIViewController { 
    UIButton *addButton; 
} 
@property (nonatomic, retain) IBOutlet UIButton *addButton; 
@property NSInteger buttonCount; 
- (IBAction)addButton:(id)sender; 

[fichier m]:

@synthesize addButton; 
@synthesize buttonCount; 

(IBAction)addButton:(id)sender { 

    float startPositionY = 60.0; 

    if (buttonCount == 6) return; 
    buttonCount += 1; 

    UIButton *tempBName = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [tempBName setTitle:[NSString stringWithFormat:@"button%i", buttonCount] forState:UIControlStateNormal]; 
    tempBName.tag = buttonCount; 
    [tempBName addTarget:self action:@selector(clickMe:)forControlEvents:UIControlEventTouchUpInside]; 
    tempBName.frame = CGRectMake(0.0, 20.0+(startPositionY*buttonCount), 80.0, 50.0); 
    tempBName.center = CGPointMake(160.0, 20.0+(startPositionY*buttonCount)); 
     // Removed the line setting the center, and move the positioning to the frame above 
    tempBName.titleLabel.adjustsFontSizeToFitWidth = TRUE; 
    [self.view addSubview:tempBName]; 
    NSLog(@"%d", buttonCount); 
} 

Merci spécial pour exécuter en boucle pour tout le travail dur pour obtenir ce travail.

+0

Juste un petit commentaire; la raison pour laquelle je continue de rajouter dans le "tempBName.center" est parce que dans ce que je fais je dois déplacer la position du bouton à la ligne centrale de l'écran. Si je retire cela, les boutons se déplacent vers l'extrême gauche de l'écran. Juste je voulais expliquer à ce sujet. – nepfable

+0

Cependant, après quelques expériences j'ai trouvé que nous pouvons nous débarrasser du "tempBName.center" et le remplacer par; float startPositionX = 120,0; tempBName.frame = CGRectMake (0.0+ (débutPositionX + boutonCount), 20.0+ (startPositionY * boutonCount), 80.0, 50.0); Cela fonctionne tout aussi bien. Donc, encore une fois, Run Loop est correct. Merci! – nepfable

+0

Merci, s'il vous plaît marquer ma réponse comme acceptée. – RunLoop