2010-06-25 5 views
2

Je me suis cassé la tête ces deux derniers jours en cherchant et en essayant certaines de mes propres solutions. J'ai placé un UIBarButtonItem à travers IB avec une image dans la barre supérieure pour agir comme un bouton mute/unmute. Tout fonctionne sauf que l'image ne change pas. J'ai utilisé le code suivant et il compile, mais aucun changementbascule image personnalisée dans un UIBarButtonItem

if(mute == YES) { 
    UIImage *unmuteImage = [UIImage imageNamed:@"audio-on.png"]; 
    [self.muteButton setImage:unmuteImage]; 
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"muteKey"]; 
} 
else { 
    UIImage *muteImage = [UIImage imageNamed:@"audio-off.png"]; 
    [self.muteButton setImage:muteImage]; 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"muteKey"]; 
} 
+0

Avez-vous essayé de nettoyer la construction? Assurez-vous que l'application n'est pas en cours d'exécution, puis appuyez sur SHIFT-CMD-K. – Emil

+0

Je suppose que vous avez vérifié que self.muteButton n'est pas nul? Vous l'avez définitivement connecté dans Interface Builder? – deanWombourne

+0

im en cours d'exécution sur mon ipod touch. J'ai un NSLog qui me dit quel est l'état de bool à chaque fois que j'appuie sur le bouton et ça va. Le son s'allume ou s'éteint comme il se doit. Le seul problème est que l'icône reste toujours la même. C'est le [self.muteButton setImage: muteImage] qui ne fonctionne pas même s'il est compilé. –

Répondre

5

J'ai finalement pensé à elle ... seulement pris quelques jours mais j'ai été trop occupé pour afficher une solution. Nous allons enfin avoir le temps et je suis heureux de poster ma solution. J'avais l'intuition que cela ne fonctionnerait pas à moins que cela ne soit fait à 100% par programmation, et j'avais raison. Voici la solution finale à mon problème:

if(mute == YES) 
{ 
    UIImage *image = [UIImage imageNamed:@"audio-off.png"]; 
    UIButton *myMuteButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    myMuteButton.bounds = CGRectMake(0, 0, image.size.width, image.size.height);  
    [myMuteButton setImage:image forState:UIControlStateNormal]; 
    [myMuteButton addTarget:self action:@selector(mute) forControlEvents:UIControlEventTouchUpInside];  
    UIBarButtonItem *myMuteBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myMuteButton]; 
    navBar.leftBarButtonItem = myMuteBarButtonItem; 
    [myMuteBarButtonItem release]; 
} 
else 
{ 
    UIImage *image = [UIImage imageNamed:@"audio-on.png"]; 
    UIButton *myUnmuteButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    myUnmuteButton.bounds = CGRectMake(0, 0, image.size.width, image.size.height);  
    [myUnmuteButton setImage:image forState:UIControlStateNormal]; 
    [myUnmuteButton addTarget:self action:@selector(mute) forControlEvents:UIControlEventTouchUpInside];  
    UIBarButtonItem *myUnmuteBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myUnmuteButton]; 
    navBar.leftBarButtonItem = myUnmuteBarButtonItem; 
    [myUnmuteBarButtonItem release]; 
} 

la bonne nouvelle est que j'ai finalement terminé mon application et l'a soumis à l'App Store. J'espère que tout ira bien et je suis impatient d'y être!

+0

Belle solution - vous pouvez également l'affiner légèrement en utilisant simplement un UIButton et en définissant deux images; un pour l'état sélectionné et un pour l'état normal. Ensuite, en appuyant sur le bouton de sourdine, vous changez simplement l'état du bouton, c'est-à-dire [myButton setSelected: YES]; –

+1

J'ai essayé d'utiliser cette solution, mais pour une raison quelconque, ma cible n'est jamais appelée lorsque j'appuie sur le bouton. Une idée pourquoi? – Stavash

0

Swift,

J'ai mis le mien dans une instance var, et utilisé que pour basculer mon commutateur. J'ai également eu 3 boutons dans ma barre de navigation.

private var activeStaff:Staff? { 
    didSet { 
     let image = (activeStaff == nil) ? UIImage(named: "active")! : UIImage(named: "notActive")! 
     let button = UIBarButtonItem(image: image, style: .Plain, target: self, action: "activePressed:") 

     if navigationItem.rightBarButtonItems?.count == 3 { 
      navigationItem.rightBarButtonItems?.removeAtIndex(0) 
     } 

     navigationItem.rightBarButtonItems?.insert(button, atIndex: 0) 
    } 
} 
Questions connexes