2010-11-17 17 views
1

Je veux savoir comment ajouter la fonction de basculement à un UIButton, quelque chose comme si l'utilisateur appuie sur un bouton non sélectionné le bouton est sélectionné et reste sélectionné jusqu'à ce que l'utilisateur le tape à nouveau en le désélectionnant comme il était avant.Implémentation de la fonction de bascule dans un UIButton

Je pensais faire un IBAction qui le passe de non-sélectionné à sélectionné, comment puis-je faire cela?

Heres ce que j'essayé:

-(IBAction)toggle { 

    //Toggle on implementation. 

     button.selected = YES; 
     button.highlighted = NO; 
     button.enabled = YES; 

    //Toggle off implementation. 

    if (button.highlighted == YES) { 

     button.selected = NO; 
     button.highlighted = YES; 
     button.enabled = NO; 
    } 
} 

problème ...

-(IBAction)toggleFav { 

    if (favButton == nil) { 

     UIImage *unselectedImage = [UIImage imageNamed:@"favUntapped.png"]; 
     UIImage *selectedImage = [UIImage imageNamed:@"favTapped.png"]; 
     [favButton setImage:unselectedImage forState:UIControlStateNormal]; 
     [favButton setImage:selectedImage forState:UIControlStateSelected]; 
     [favButton setFrame:CGRectMake(0, 0, 40, 40)]; 
    }  

    if([favButton isSelected]){ 

     //Add to menu. 
     [favButton setSelected:NO]; 
    } else { 

     //Remove from menu. 

     [favButton setSelected:YES]; 
    } 
} 

Répondre

11
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     UIImage *unselectedImage = [UIImage imageNamed:@"unselected.png"]; 
     UIImage *selectedImage = [UIImage imageNamed:@"selected.png"]; 
     UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [b setBackgroundImage:unselectedImage forState:UIControlStateNormal]; 
     [b setBackgroundImage:selectedImage forState:UIControlStateSelected]; 
     [b addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
     [b setFrame:CGRectMake(0, 0, 40, 40)]; 
     [cell.contentView addSubview:b]; 
    }  
    return cell; 
} 

-(void) buttonPressed:(UIButton *)sender 
{ 
    if([sender isSelected]){ 
     //... 
     [sender setSelected:NO]; 
    } else { 
     //...  
     [sender setSelected:YES]; 
    } 

} 

éditer
Votre code toggleFav n'a pas beaucoup de sens.
if (favButton == nil) { vérifie si favButton est présent. Mais si vous le branchez avec IB, il devrait toujours être là à ce moment-là. Et si ce n'était pas comment le bouton pouvait-il appeler cette méthode? Alors faites comme ceci:

-(void)viewDidLoad 
{ 
    //.... 
    UIImage *unselectedImage = [UIImage imageNamed:@"favUntapped.png"]; 
    UIImage *selectedImage = [UIImage imageNamed:@"favTapped.png"]; 
    [favButton setImage:unselectedImage forState:UIControlStateNormal]; 
    [favButton setImage:selectedImage forState:UIControlStateSelected]; 
    [favButton setFrame:CGRectMake(0, 0, 40, 40)]; 
    //.... 
} 


-(IBAction)toggleFav:(UIButton *)sender { 
    if([sender isSelected]){ 
     //... 
     [sender setSelected:NO]; 
    } else { 
     //...  
     [sender setSelected:YES]; 
    } 
} 

modifier
Here vous trouverez un exemple de projet, avec un DetaiView, qui détient un bouton avec les 2 états.
Remarque: Je sauvegarde les informations sur le bouton sélectionné dans NSUserDefaults. Tu ne devrais pas faire ça. Au lieu de cela, vous voudrez l'enregistrer dans le modèle. Mais comme je n'ai pas d'informations sur votre modèle, j'utilise simplement NSUserDefaults.

+0

comme je l'ai écrit dans ur [autre question] (http://stackoverflow.com/questions/4081154/adding-favorites-feature-to-iphone-app-iphone-sdk/4081265#4081265): les étoiles ne sont pas liées à la tableview. ils font partie d'un bouton. Vous pouvez ajouter un bouton à n'importe quelle vue, c'est-à-dire (dérivant de) un UIView. Si vous ne le savez pas, vous devriez vraiment lire quelques [documentation] (http://stackoverflow.com/questions/4190910/book-app-tutorial-iphone/4191037#4191037) – vikingosegundo

+2

homme, je dois dire: ur l'attitude n'est vraiment pas utile ("je ne veux pas", "je n'ai pas de code", "j'attends toujours", "j'attends encore (encore)"). Il y a beaucoup de gens ici, prêts à vous aider. Mais vous devriez les convaincre, que vous avez essayé de le gérer de votre mieux. ce qui signifie: se référant à docs, montrant le code, expliquant exactement où vous êtes coincé. – vikingosegundo

+0

J'ai essayé le code mais quand je sors de la vue où je l'ai implémenté. Il ne se souvient pas de l'état. J'ai également implémenté votre code sous IBAction. – Souljacker

0

Utilisez la propriété button.highlighted

+0

le bouton s'allume et s'éteint tout de suite? – Souljacker

+0

ou bien utilisez une valeur de drapeau et définissez deux images de bouton de diff en conséquence – KingofBliss

+0

Qu'est-ce que cela signifie Roi de Béatitude? – Souljacker

0

U devrait code comme ceci

-(IBAction)toggle:(id)sender { 

    //Toggle on implementation. 
    if (sender.highlighted == NO) 
    { 
     sender.selected = YES; 
     sender.highlighted = NO; 
     sender.enabled = YES; 
    } 

    //Toggle off implementation. 

    else{ 

     sender.selected = NO; 
     sender.highlighted = YES; 
     sender.enabled = NO; 
    } 
} 
+0

Etes-vous sûr que cela devrait être l'expéditeur? – Souljacker

+0

Cela fonctionne bien pour moi .. – KingofBliss

+0

ok, mais quand je l'exécute, il obtient des erreurs comme en surbrillance n'est pas une structure ou une union. – Souljacker

2
-(void)hitButton:(UIButton*)button 
{ 
    buttonOnFlag = !buttonOnFlag; 
    if(buttonFlag) 
     [self performSelector:@selector(setHighlight:) withObject:button afterDelay:0]; 
} 

- (void)setHighlight:(UIButton*)button 
{ 
    button.highlighted = true; 
}