Désactiver un bouton


95

Je souhaite désactiver un bouton ( UIButton) sur iOS après avoir cliqué dessus. Je suis nouveau dans le développement pour iOS mais je pense que le code équivalent sur l'objectif - C est le suivant:

button.enabled = NO;

Mais je ne pouvais pas faire ça rapidement.

Réponses:


206

La valeur booléenne de NOSwift est false.

button.isEnabled = false

devrait le faire.

Voici la documentation Swift pour UIControlla isEnabledpropriété de.


C'est la même chose que vous ayez créé le bouton via son initialiseur ou via des storyboards.
KerrM

Je voulais dire quand je n'ai pas d'exutoire. Quoi qu'il en soit, la solution est de définir le bouton globalement.
Daniel Springer

43

Si vous voulez que le bouton reste statique sans l’apparence «enfoncé»:

// Swift 2
editButton.userInteractionEnabled = false 

// Swift 3
editButton.isUserInteractionEnabled = false 

Rappelles toi:

1) Vous êtes IBOutlet->@IBOutlet weak var editButton: UIButton!

2) Le code ci-dessus entre viewWillAppear


1
Je pensais que c'était exactement ce que je cherchais, mais cela semble être uniquement UIKit, pas AppKit.
drootang

11

La façon dont je fais cela est la suivante:

@IBAction func pressButton(sender: AnyObject) {
    var disableMyButton = sender as? UIButton
    disableMyButton.enabled = false
}

L'IBAction est connecté à votre bouton dans le storyboard.

Si vous avez configuré votre bouton en tant que point de vente:

    @IBOutlet weak var myButton: UIButton!

Ensuite, vous pouvez accéder aux propriétés activées en utilisant le. notation sur le nom du bouton:

    myButton.enabled = false

Fonctionne très bien pour moi dans Swift 4. J'ai remarqué que par défaut, il définit l'expéditeur sur Any au lieu d'AnyObject mais les deux fonctionnent toujours .... Quelle erreur obtenez-vous?
Krivvenz

Pour plus de clarté, vous devriez peut-être indiquer dans votre réponse ci-dessus que l'IBOutlet est nécessaire pour que votre code fonctionne. Que l'IBOutlet soit nécessaire ou non, c'est ce qui m'a dérouté. De toute évidence, c'est nécessaire.

Ce n'est pas nécessaire pour que cela fonctionne. Vous pouvez taper cast le bouton dans IBAction et changer le statut activé ou si vous l'avez configuré comme IBOutlet, vous pouvez le faire en utilisant le .notation sur la prise. Les deux méthodes fonctionnent.
Krivvenz

Je pense que l'IBOutlet est nécessaire si vous souhaitez désactiver le bouton à partir d'une autre fonction.


5

Pour ceux qui ont googlé "désactiver un bouton" mais qui peuvent avoir des cas d'utilisation plus nuancés:

Désactiver avec effet visuel: comme d'autres l'ont dit, cela empêchera d'appuyer sur le bouton et le système le rendra automatiquement désactivé:

yourButton.isEnabled = false 

Désactiver sans effet visuel: utilisez-vous un bouton dans un cas où il devrait paraître normal mais ne pas se comporter comme le bouton J'aime en réagissant aux touches? Essaye ça!

yourButton.userInteractionEnabled = false

Masquer sans désactiver: Cette approche masque le bouton sans le désactiver (invisible mais peut toujours être tapé):

 yourButton.alpha = 0.0

Supprimer: cela supprimera complètement la vue:

 yourButton.removeFromSuperView()

Appuyez sur quelque chose derrière un bouton: avez deux boutons empilés et vous voulez que le bouton supérieur agisse temporairement comme s'il n'était pas là? Si vous n'avez plus besoin du bouton supérieur, supprimez-le. Si vous en avez besoin à nouveau, essayez de réduire sa hauteur ou sa largeur à 0!


1

Vous pouvez activer / désactiver un bouton à l'aide de la propriété isEnabledou isUserInteractionEnabled.

La différence entre deux est:

  • isEnabledest une propriété de UIControl (super classe de UIButton) et il a des effets visuels (c'est-à-dire grisés) d'activation / désactivation

  • isUserInteractionEnabled est une propriété de UIView (super classe de UIControl) et n'a aucun effet visuel bien que mais atteint l'objectif

Utilisation:

myButton.isEnabled = false // Recommended approach

myButton.isUserInteractionEnabled = false // Alternative approach

Savez-vous pourquoi j'obtiens cette erreur? Value of type '(AnyObject) -> ()' has no member 'isEnabled'

J'obtiens également une erreur si je passe (_ sender: )à UIButton. L'erreur se lit comme suit:Value of type '(UIButton) -> ()' has no member 'isEnabled'

0

Disons que dans Swift 4, vous avez un bouton configuré pour une séquence IBActioncomme ceci @IBAction func nextLevel(_ sender: UIButton) {} et que d'autres actions se produisent dans votre application (c'est-à-dire une minuterie, un gamePlay, etc.). Plutôt que de désactiver le bouton segue, vous voudrez peut-être donner à votre utilisateur la possibilité d'utiliser ce segue pendant que les autres actions sont encore en cours et SANS CRASHING L'APPLICATION . Voici comment:

var appMode = 0

@IBAction func mySegue(_ sender: UIButton) {

    if appMode == 1 {  // avoid crash if button pressed during other app actions and/or conditions
        let conflictingAction = sender as UIButton
        conflictingAction.isEnabled = false
    }
}

Veuillez noter que vous aurez probablement d'autres conditions à l'intérieur if appMode == 0et / ou if appMode == 1qui se produiront toujours et NON en conflit avec le mySeguebouton. Ainsi, ÉVITER UN CRASH .


0

Le bouton peut être désactivé dans Swift 4 par le code

@IBAction func yourButtonMethodname(sender: UIButon) {
 yourButton.isEnabled = false 
}

Si vous essayez votre code, cette erreur devrait se produire:Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Je pense que tu veux dire yourButton(sender: UIButton). Votre code mis à jour provoquera probablement l'erreur suivante:Value of type '(UIButton) -> ()' has no member 'isEnabled'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.