UIButton en Swift no está registrando toques

Estoy intentando crear un button UIB usando Swift. Se comstack bien y puedo ver mi button en el simulador, pero cuando hago clic en él, no pasa nada. Este es el código que estoy usando:

let settings = UIButton() settings.addTarget(self, action: "touchedSet:", forControlEvents: UIControlEvents.TouchUpInside) settings.setTitle("Settings", forState: .Normal) settings.frame = CGRectMake(0, 530, 150, 50) scrollView.addSubview(settings) 

En la misma class, aquí está la function 'touchedSet':

 func touchedSet(sender: UIButton!) { println("You tapped the button") } 

Estoy usando el simulador ya que no tengo un dispositivo iOS 8.0, ¿ese podría ser el problema?

¡Gracias!

Veo que es una vieja pregunta, pero ayer me encontré con un problema muy similar. Mis botones se resaltaron al tacto pero no activaron la acción.

Tengo dos controlleres de vista. Una vista cubre la vista de otros y el button está en la vista superior.

p.ej.

  • Rootviewcontroller tiene vista posterior

  • Topviewcontroller tiene vista superior

El button en la vista superior no llama a la acción si no agrego el topviewcontroller como childviewcontroller del rootviewcontroller. Después de agregar el controller de vista superior como childviewcontroller, comenzó a funcionar.

En resumidas counts: simplemente intente agregar el supervisor de vista de botones superview como childviewcontroller al control de vista de vistas principales con el siguiente método

 func addChildViewController(_ childController: UIViewController) 

Los selectores son una estructura que debe crearse.

Hacerlo de esta forma…

 settingsButton.addTarget(self, action: Selector("showSettings"), forControlEvents: .TouchUpInside) 

Deberias hacer eso.

En el simulador, a veces no reconoce el selector. Parece que hay un error. Acabo de cambiar el nombre de acción (selector), y funcionó.

 let buttonPuzzle:UIButton = UIButton(frame: CGRectMake(100, 400, 100, 50)) buttonPuzzle.backgroundColor = UIColor.greenColor() buttonPuzzle.setTitle("Puzzle", forState: UIControlState.Normal) buttonPuzzle.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside) buttonPuzzle.tag = 22; self.view.addSubview(buttonPuzzle) 

La function selectora está aquí:

 func buttonAction(sender:UIButton!) { var btnsendtag:UIButton = sender if btnsendtag.tag == 22 { //println("Button tapped tag 22") } } 

Para aquellos que también están atrapados en el tutorial:

Me encontré con el mismo problema, cuando estaba siguiendo Apples "Iniciar desarrollo de aplicaciones iOS (Swift)". Resultó que he supervisado estas líneas de código en el tutorial

 override var intrinsicContentSize : CGSize { return CGSize(width: 240, height: 44) } 

Agregarlos a mí RatingControl solucionó el problema.

Tuve este problema cuando la vista principal de mi button tiene isUserInteractionEnabled == false . Todas las subvenciones tendrán la misma userInteraction que la vista principal. Entonces, acabo de agregar esta línea parentView.isUserInteractionEnabled = true y el problema desapareció. Espero que esto ayude a alguien.

Solo puedo ver un problema: debes configurar la action con Selector siguiente manera:

 settings.addTarget(self, action: Selector("touchedSet:"), forControlEvents: UIControlEvents.TouchUpInside) 

No olvide insert : si necesita pasar parameters a la function.

Dijiste dentro de la misma class. Asegúrese de que el código del button esté en viewDidLoad () y que la acción esté fuera de él, pero dentro de la class si está trabajando con una vista.

Entonces debes usar la siguiente línea

 settings.userInteractionEnabled = true 

El problema con ese tutorial de Apple es la forma en que colocan UIView (RatingControl) dentro de StackView, lo cual es incorrecto. La UIView (RatingControl) debe estar fuera de StackView. Por lo tanto, la solución es: 1. Arrastre la UIView (RatingControl) fuera de StackView 2. Establezca las restricciones para la nueva position de RatingControl – Margen principal al contenedor igual a cero – Margen posterior al contenedor igual a cero – Margen superior a el StackView igual a cero

Con estas nuevas restricciones, ahora el RatingControl tendrá el mismo valor que el Contenedor, sin importar el tamaño de la pantalla del dispositivo, y siempre estará justo detrás del StackView donde aparecerá el selector de fotos.

Espero que esto les ayude.

Vieja pregunta, pero pensé que daría algo de ayuda a otros que buscan este problema. En primer lugar, no estoy completamente seguro de que esto sea correcto, así que corrígeme si me equivoco.

Pero si configura el selector incorrectamente, la aplicación se bloqueará cuando presione el button ya que está suscrito a un selector que no existe. Lo que significa que su selector está funcionando. Mi conjetura es que algo más está bloqueando el evento táctil, suponiendo que UIButton.enabled = true y UIButton.userInteractionEnabled = true . Por lo general, puede verificar esto presionando el button durante un time y ver si golpea. Si lo hace, entonces tiene un UIGestureRecognizer añadido a un lugar que ocupa primero los hits. También podría ser UIScrollView que está retrasando la input táctil (hay una checkbox para esto en el Inspector).

Espero que esto ayude a alguien, y espero que sea exacto.

Asegúrate de vincularte con tu variable de instancia de IBOutlet en tu código si estás usando storyboard.

He encontrado un ejemplo similar para Swift 2 y adaptado para Swift 3. Probé que está funcionando muy bien. Espero que ayude.

 // http://lab.dejaworks.com/ios-swift-3-playground-uibutton-action // Trevor D. Beydag import UIKit import PlaygroundSupport class Responder : NSObject { func action() { print("Button pressed!") } } let containerView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 300.0, height: 600.0)) PlaygroundPage.current.liveView = containerView let responder = Responder() let button = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) button.backgroundColor = UIColor.green button.setTitle("TEST", for: .normal) button.addTarget(responder, action: #selector(Responder.action), for: .touchUpInside) containerView.addSubview(button) 

Tuve un problema similar cuando tenía un subViewController con botones y tapHandlers para coincidir, y quería ubicarlo en una stack en un superViewController separado.

Esto provocó que ninguno de los TapHandlers deba activarse, y la solución fue en lugar de usar solamente AddArrangedSubview (subViewController.view), también usé addChildViewController(subViewController) en la vista de supervisión para permitir que el childViewController continúe funcionando como un viewController y no solo una vista.