Disabilita un pulsante


95

Voglio disabilitare un pulsante ( UIButton) su iOS dopo averlo cliccato. Sono nuovo nello sviluppo per iOS ma penso che il codice equivalente sull'obiettivo - C sia questo:

button.enabled = NO;

Ma non potevo farlo su Swift.

Risposte:


206

Il valore booleano per NOin Swift è false.

button.isEnabled = false

dovrebbe farlo.

Ecco la documentazione Swift per UIControlla isEnabledproprietà di.


È lo stesso se hai creato il pulsante tramite il suo inizializzatore o tramite storyboard.
KerrM

Volevo dire quando non ho sbocco. Comunque la soluzione è definire il pulsante globalmente.
Daniel Springer

43

Se desideri che il pulsante rimanga statico senza l'aspetto "premuto":

// Swift 2
editButton.userInteractionEnabled = false 

// Swift 3
editButton.isUserInteractionEnabled = false 

Ricorda:

1) Il tuo IBOutletè ->@IBOutlet weak var editButton: UIButton!

2) Il codice sopra va inserito viewWillAppear


1
Pensavo fosse esattamente quello che stavo cercando, ma sembra essere solo UIKit, non AppKit.
drootang

11

Il modo in cui lo faccio è il seguente:

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

L'IBAction è collegata al tuo pulsante nello storyboard.

Se hai impostato il tuo pulsante come outlet:

    @IBOutlet weak var myButton: UIButton!

Quindi è possibile accedere alle proprietà abilitate utilizzando il file. notazione sul nome del pulsante:

    myButton.enabled = false

Funziona bene per me in Swift 4. Ho notato che per impostazione predefinita imposta il mittente su Any invece di AnyObject ma entrambi funzionano ancora .... Che errore stai ricevendo?
Krivvenz

Per chiarezza, forse dovresti affermare nella tua risposta sopra che l'IBOutlet è necessario affinché il tuo codice funzioni. Ciò che mi ha confuso è stato il fatto che IBOutlet fosse o meno necessario. Chiaramente è necessario.

Non è necessario perché funzioni. Puoi digitare cast the button in IBAction e cambiare lo stato abilitato o se lo hai impostato come IBOutlet puoi farlo usando la .notation sulla presa. Entrambi i modi funzionano.
Krivvenz

Credo che IBOutlet sia necessario se si desidera disabilitare il pulsante dall'interno di un'altra funzione.


5

Per coloro che hanno cercato su Google "disabilita un pulsante" ma potrebbero avere casi d'uso più sfumati:

Disabilita con effetto visivo: come altri hanno detto, questo impedirà la pressione del pulsante e il sistema lo farà sembrare automaticamente disabilitato:

yourButton.isEnabled = false 

Disabilita senza effetto visivo: stai usando un pulsante in un caso in cui dovrebbe sembrare normale ma non si comporta come il pulsante Mi piace reagendo ai tocchi? Prova questo!

yourButton.userInteractionEnabled = false

Nascondi senza disabilitare: questo approccio nasconde il pulsante senza disabilitarlo (invisibile ma può ancora essere toccato):

 yourButton.alpha = 0.0

Rimuovi: rimuoverà completamente la visualizzazione:

 yourButton.removeFromSuperView()

Tocca qualcosa dietro un pulsante: hai due pulsanti impilati e vuoi che il pulsante in alto si comporti temporaneamente come se non fosse lì? Se non avrai più bisogno del pulsante in alto, rimuovilo. Se ne avrai bisogno di nuovo, prova a condensarne l'altezza o la larghezza a 0!


1

È possibile abilitare / disabilitare un pulsante utilizzando isEnabledo la isUserInteractionEnabledproprietà.

La differenza tra due è:

  • isEnabledè una proprietà di UIControl (super classe di UIButton) e ha effetti visivi (cioè disattivati) di abilitazione / disabilitazione

  • isUserInteractionEnabled è una proprietà di UIView (super classe di UIControl) e non ha alcun effetto visivo sebbene raggiunga lo scopo

Utilizzo:

myButton.isEnabled = false // Recommended approach

myButton.isUserInteractionEnabled = false // Alternative approach

Sai perché ricevo questo errore? Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Inoltre ricevo un errore se cambio (_ sender: )in UIButton. L'errore legge:Value of type '(UIButton) -> ()' has no member 'isEnabled'

0

Supponiamo che in Swift 4 tu abbia un pulsante impostato per un segue IBActioncome questo @IBAction func nextLevel(_ sender: UIButton) {} e che tu abbia altre azioni che si verificano all'interno della tua app (ad esempio un timer, gamePlay, ecc.). Piuttosto che disabilitare il pulsante Segue, potresti dare al tuo utente la possibilità di usarlo mentre le altre azioni sono ancora in corso e SENZA ARRESTARE L'APP . Ecco come:

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
    }
}

Tieni presente che probabilmente avrai altre condizioni all'interno if appMode == 0e / o if appMode == 1che si verificheranno ancora e NON entreranno in conflitto con il mySeguepulsante. Quindi, EVITANDO UN INCIDENTE .


0

Il pulsante può essere disabilitato in Swift 4 dal codice

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

Se provi il tuo codice dovrebbe verificarsi questo errore:Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Penso che tu intenda yourButton(sender: UIButton). Il codice aggiornato causerà probabilmente il seguente errore:Value of type '(UIButton) -> ()' has no member 'isEnabled'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.