Desativar um botão


95

Desejo desabilitar um botão ( UIButton) no iOS depois que ele é clicado. Eu sou novo no desenvolvimento para iOS, mas acho que o código equivalente no objetivo - C é este:

button.enabled = NO;

Mas eu não poderia fazer isso rápido.

Respostas:


206

O valor booleano para NOem Swift é false.

button.isEnabled = false

deve fazer isso.

Aqui está a documentação do Swift para UIControla isEnabledpropriedade de.


É o mesmo se você criou o botão por meio de seu inicializador ou por meio de storyboards.
KerrM

Eu quis dizer quando não tenho saída. De qualquer forma, a solução é definir o botão globalmente.
Daniel Springer

43

Se você deseja que o botão permaneça estático sem a aparência de "pressionado":

// Swift 2
editButton.userInteractionEnabled = false 

// Swift 3
editButton.isUserInteractionEnabled = false 

Lembrar:

1) Seu IBOutleté ->@IBOutlet weak var editButton: UIButton!

2) O código acima entra viewWillAppear


1
Achei que era exatamente o que eu estava procurando, mas parece ser apenas UIKit, não AppKit.
drootang

11

A maneira como faço isso é a seguinte:

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

O IBAction é conectado ao seu botão no storyboard.

Se você configurou o botão como um Outlet:

    @IBOutlet weak var myButton: UIButton!

Em seguida, você pode acessar as propriedades habilitadas usando o. notação no nome do botão:

    myButton.enabled = false

Funciona bem para mim no Swift 4. Percebi que, por padrão, ele define o remetente como Any em vez de AnyObject, mas ambos ainda funcionam ... Que erro você está obtendo?
Krivvenz

Para maior clareza, talvez você deva declarar em sua resposta acima que o IBOutlet é necessário para que seu código funcione. Se o IBOutlet era necessário ou não é o que me confundiu. Claramente, é necessário.

Não é necessário para que funcione. Você pode digitar o botão cast no IBAction e alterar o status de habilitado ou se você tiver configurado como um IBOutlet você pode fazer isso usando o .notation no outlet. Ambas as formas funcionam.
Krivvenz

Eu acredito que o IBOutlet é necessário se você deseja desativar o botão em outra função.


5

Para aqueles que pesquisaram "desativar um botão" no Google, mas podem ter casos de uso mais diferenciados:

Desativar com efeito visual: como já foi dito, isso impedirá que o botão seja pressionado e o sistema fará com que pareça desativado automaticamente:

yourButton.isEnabled = false 

Desativar sem efeito visual: você está usando um botão em um caso em que deveria parecer normal, mas não se comportar como botão de gostar ao reagir aos toques? Experimente isso!

yourButton.userInteractionEnabled = false

Ocultar sem desativar: esta abordagem oculta o botão sem desativá-lo (invisível, mas ainda pode ser tocado):

 yourButton.alpha = 0.0

Remover: Isso removerá totalmente a visualização:

 yourButton.removeFromSuperView()

Toque em algo atrás de um botão: tem dois botões empilhados e deseja que o botão superior temporariamente aja como se não estivesse lá? Se você não precisar do botão superior novamente, remova-o. Se você precisar dele novamente, tente condensar sua altura ou largura para 0!


1

Você pode ativar / desativar um botão usando isEnabledou isUserInteractionEnabledpropriedade.

A diferença entre os dois é:

  • isEnabledé uma propriedade do UIControl (superclasse do UIButton) e tem efeitos visuais (ou seja, acinzentado) de habilitar / desabilitar

  • isUserInteractionEnabled é uma propriedade de UIView (superclasse de UIControl) e não tem efeito visual, embora atinja o propósito

Uso:

myButton.isEnabled = false // Recommended approach

myButton.isUserInteractionEnabled = false // Alternative approach

Você sabe por que estou recebendo este erro? Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Também recebo um erro se mudar (_ sender: )para UIButton. O erro diz:Value of type '(UIButton) -> ()' has no member 'isEnabled'

0

Digamos que no Swift 4 você tenha um botão configurado para uma segue IBActioncomo este @IBAction func nextLevel(_ sender: UIButton) {} e outras ações ocorram em seu aplicativo (por exemplo, um temporizador, gamePlay, etc.). Em vez de desabilitar o botão segue, você pode dar ao seu usuário a opção de usar aquele segue enquanto as outras ações ainda estão ocorrendo e SEM DERRAMAR O APP . Veja como:

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

Observe que você provavelmente terá outras condições dentro if appMode == 0e / ou if appMode == 1que ainda ocorrerão e NÃO entrarão em conflito com o mySeguebotão. Assim, EVITANDO UM CRASH .


0

O botão pode ser desabilitado no Swift 4 pelo código

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

Se você tentar seu código, este erro deverá ocorrer:Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Eu acho que você quer dizer yourButton(sender: UIButton). Seu código atualizado provavelmente causará o seguinte erro:Value of type '(UIButton) -> ()' has no member 'isEnabled'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.