2017-10-20 17 views
0

Mon exigence est de modifier l'image UIButton pour trois états différents. À partir de maintenant quand je tape sur le bouton pour les deux premières fois (les deux premiers états), cela fonctionne. Mais quand je tape pour la troisième fois ou quand il déclenche mon troisième état, la deuxième image semble toujours apparaître. Comment et résoudre ce problème? Mon code est ci-dessous.Modifier l'image UIButton lorsque vous appuyez plusieurs fois sur cette touche

@IBAction func repeateButtonPressed(_ sender: Any) { 
    let image = UIImage(named : "repeat_one") 
    let image2 = UIImage(named : "repeat") 

    if(playerRepeatMode == RepeatModes.NO_REPEAT){ 
     playerRepeatMode = RepeatModes.REPEAT_LIST 
     self.repeatButton.setBackgroundImage(image2, for: .normal) 
     self.repeatButton.backgroundColor = buttonToggleColor 
    } 
    else if(playerRepeatMode == RepeatModes.REPEAT_LIST){ 
     playerRepeatMode = RepeatModes.REPEAT 
     self.repeatButton.setBackgroundImage(image, for: .normal) 
    // self.repeatButton.setBackgroundImage(#imageLiteral(resourceName: "repeat_one"), for: UIControlState.normal) 
     self.repeatButton.backgroundColor = buttonToggleColor 
    }else{ 
     playerRepeatMode = RepeatModes.NO_REPEAT 
     self.repeatButton.setBackgroundImage(image2, for: .normal) 
     self.repeatButton.backgroundColor = UIColor.clear 
    } 
} 
+1

Vous avez seulement 2 images - comment voulez-vous voir 3 différents ? – DonMag

+0

Non pour la troisième instance, j'utilise aussi la première image, mais en changeant la sortie de l'événement click et la couleur de fond. – danu

Répondre

1

réponse après modification question

Quelques conseils pour le rendre plus facile à déboguer ...

  1. Ajouter des commentaires

  2. Utiliser des noms de variables avoir un sens - par exemple imgRepeat au lieu de image2 pour une image nommée « répéter »

Le code suivant fonctionne bien pour moi - en supposant que les images ont des zones transparentes pour montrer la couleur de fond.

@IBAction func repeateButtonPressed(_ sender: Any) { 

    let imgRepeatOne = UIImage(named : "repeat_one") 
    let imgRepeat = UIImage(named : "repeat") 


    if (playerRepeatMode == RepeatModes.NO_REPEAT) { 

     // currently NO_REPEAT, changing to REPEAT_LIST 
     playerRepeatMode = RepeatModes.REPEAT_LIST 

     // set BackroundImage to "repeat" 
     self.repeatButton.setBackgroundImage(imgRepeat, for: .normal) 

     // set BackgroundColor to buttonToggleColor 
     self.repeatButton.backgroundColor = buttonToggleColor 

    } else if (playerRepeatMode == RepeatModes.REPEAT_LIST) { 

     // currently REPEAT_LIST, changing to REPEAT 
     playerRepeatMode = RepeatModes.REPEAT 

     // set BackroundImage to "repeat_one" 
     self.repeatButton.setBackgroundImage(imgRepeatOne, for: .normal) 

     // set BackgroundColor to buttonToggleColor 
     self.repeatButton.backgroundColor = buttonToggleColor 

    } else { 

     // currently REPEAT, changing to NO_REPEAT 
     playerRepeatMode = RepeatModes.NO_REPEAT 

     // set BackroundImage to "repeat" 
     self.repeatButton.setBackgroundImage(imgRepeat, for: .normal) 

     // set BackgroundColor to clear 
     self.repeatButton.backgroundColor = UIColor.clear 

    } 

} 

Réponse originale

Je pense que le problème est que vous utilisez .setImage() en un seul endroit, mais .setBackgroundImage() dans les deux autres endroits.

Ce serait bien, en supposant voulezimage2 à utiliser comme arrière-plan et image à utiliser comme image de bouton, mais vous devez clairement les autres biens.

Alors, où vous utilisez l'image d'arrière-plan:

self.repeatButton.setBackgroundImage(image2, for: .normal) 

    // also *clear* the button image 
    self.repeatButton.setImage(nil, for: .normal) 

et où vous utilisez l'image du bouton:

self.repeatButton.setImage(image, for: .normal) 

    // also *clear* the background image 
    self.repeatButton.setBackgroundImage(nil, for: .normal) 
+0

je l'ai fait, mais n'a pas encore résolu le problème, plus j'ai mis à jour le code – danu

+0

compris avec votre conseil – danu