Deshabilitar un botón


95

Quiero deshabilitar un botón ( UIButton) en iOS después de hacer clic en él. Soy nuevo en el desarrollo para iOS, pero creo que el código equivalente en el objetivo - C es este:

button.enabled = NO;

Pero no pude hacer eso en Swift.

Respuestas:


206

El valor booleano de NOSwift es false.

button.isEnabled = false

Deberías hacerlo.

Aquí está la documentación de Swift para UIControlla isEnabledpropiedad de.


Es lo mismo si creó el botón a través de su inicializador o mediante guiones gráficos.
KerrM

Me refiero a cuando no tengo salida. De todos modos, la solución es definir el botón de forma global.
Daniel Springer

43

Si desea que el botón permanezca estático sin la apariencia de "presionado":

// Swift 2
editButton.userInteractionEnabled = false 

// Swift 3
editButton.isUserInteractionEnabled = false 

Recuerda:

1) Tu IBOutletes ->@IBOutlet weak var editButton: UIButton!

2) El código anterior va en viewWillAppear


1
Pensé que esto era exactamente lo que estaba buscando, pero parece ser solo UIKit, no AppKit.
drootang

11

La forma en que hago esto es la siguiente:

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

La IBAction está conectada a su botón en el guión gráfico.

Si tiene su botón configurado como un Outlet:

    @IBOutlet weak var myButton: UIButton!

Luego puede acceder a las propiedades habilitadas usando el. notación en el nombre del botón:

    myButton.enabled = false

Funciona bien para mí en Swift 4. Me di cuenta de que de forma predeterminada establece el remitente en Any en lugar de AnyObject, pero ambos siguen funcionando ... ¿Qué error está recibiendo?
Krivvenz

Para mayor claridad, tal vez debería indicar en su respuesta anterior que se requiere IBOutlet para que su código funcione. Si se necesitaba o no el IBOutlet es lo que me confundió. Claramente, es necesario.

No es necesario para que funcione. Puede escribir enviar el botón en la IBAction y cambiar el estado habilitado o, si lo tiene configurado como IBOutlet, puede hacerlo usando la .notation en la salida. Ambas formas funcionan.
Krivvenz

Creo que se necesita el IBOutlet si desea desactivar el botón desde otra función.


5

Para aquellos que buscaron en Google "deshabilitar un botón" pero pueden tener casos de uso más matizados:

Deshabilitar con efecto visual: como han dicho otros, esto evitará que se presione el botón y el sistema automáticamente lo hará parecer deshabilitado:

yourButton.isEnabled = false 

Desactivar sin efecto visual: ¿Estás usando un botón en un caso en el que debería verse normal pero no comportarse como el botón Me gusta al reaccionar a los toques? ¡Prueba esto!

yourButton.userInteractionEnabled = false

Ocultar sin deshabilitar: este enfoque oculta el botón sin deshabilitarlo (invisible pero aún se puede tocar):

 yourButton.alpha = 0.0

Eliminar: esto eliminará la vista por completo:

 yourButton.removeFromSuperView()

Toque algo detrás de un botón: ¿Tiene dos botones apilados y desea que el botón superior actúe temporalmente como si no estuviera allí? Si no necesita el botón superior nuevamente, quítelo. Si lo necesitará de nuevo, intente condensar su altura o ancho a 0.


1

Puede habilitar / deshabilitar un botón usando isEnabledoisUserInteractionEnabled propiedad .

La diferencia entre dos es:

  • isEnabledes una propiedad de UIControl (superclase de UIButton) y tiene efectos visuales (es decir, atenuados) de habilitar / deshabilitar

  • isUserInteractionEnabled es una propiedad de UIView (superclase de UIControl) y no tiene efecto visual, pero logra el propósito

Uso:

myButton.isEnabled = false // Recommended approach

myButton.isUserInteractionEnabled = false // Alternative approach

¿Sabes por qué recibo este error? Value of type '(AnyObject) -> ()' has no member 'isEnabled'

También obtengo un error si cambio (_ sender: )aUIButton . El error dice:Value of type '(UIButton) -> ()' has no member 'isEnabled'

0

Digamos que en Swift 4 tienes un botón configurado para una transición como IBActionesta @IBAction func nextLevel(_ sender: UIButton) {} y tienes otras acciones que ocurren dentro de tu aplicación (es decir, un temporizador, gamePlay, etc.). En lugar de deshabilitar el botón de segue, es posible que desee darle a su usuario la opción de usar ese segue mientras las otras acciones aún están ocurriendo y SIN APLICAR CERRAR LA APLICACIÓN . Así es cómo:

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

Tenga en cuenta que es probable que tenga otras condiciones dentro if appMode == 0y / o if appMode == 1que aún ocurran y NO entren en conflicto con el mySeguebotón. Por lo tanto, EVITAR UN CHOQUE .


0

El botón se puede desactivar en Swift 4 mediante el código

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

Si prueba su código, debería producirse este error:Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Creo que te refieres yourButton(sender: UIButton). Su código actualizado probablemente causará el siguiente error:Value of type '(UIButton) -> ()' has no member 'isEnabled'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.