Swift UIButton override, setImage no funciona

Estoy tratando de subclass UIButton con mi propia class de button llamada FlipsSendButton . El código para esta class se detalla a continuación. En él, puedes ver que estoy llamando a setImage para intentar configurar la image del button. Sin embargo, después de comstackr, todo funciona correctamente, EXCEPTO la configuration de la vista de la image.

¿Me faltan algunos pasos en mi código para configurar la image, o tal vez llamar incorrectamente a los operadores opcionales y desenvolver?

 import Foundation class FlipSendButton : UIButton { let bgColor : UIColor init(frame aFrame: CGRect, bgColor aColor: UIColor) { bgColor = aColor; super.init(frame: aFrame) addTarget(self, action: Selector("buttonTouched:"), forControlEvents: .TouchUpInside) backgroundColor = aColor; setImage(UIImage(named: "flips.png") as UIImage?, forState: .Normal) } requinetworking init(coder aDecoder: NSCoder) { bgColor = UIColor.lightGrayColor() super.init(coder: aDecoder) } func buttonTouched(sender: UIButton) { if backgroundColor == UIColor.lightGrayColor() { backgroundColor = bgColor } else { backgroundColor = UIColor.lightGrayColor() } } } 

Además, vale la pena mencionar que la image flips.png está en mi carpeta images.xassets, si eso marca la diferencia.

Has olvidado la propiedad buttonType . Además, será mejor que no subclasss el UIButton ( UIButton esto por la razón).

En cambio, debe establecer la propiedad UIButtonTypeCustom en UIButtonTypeCustom cuando UIButtonTypeCustom el button, algún código de ejemplo:

 var myButton = UIButton.buttonWithType(.UIButtonTypeCustom) myButton.setImage(UIImage(named: "flips.png") as UIImage?, forState: .Normal) myButton.addTarget(self, action: Selector("buttonTouched:"), forControlEvents: .TouchUpInside) func buttonTouched(sender: UIButton) { if sender.backgroundColor == UIColor.lightGrayColor() { sender.backgroundColor = bgColor } else { sender.backgroundColor = UIColor.lightGrayColor() } } 

– EDITAR –

Si desea reutilizar la configuration de estilo, una mejor manera es definir su propio método de fábrica de UIButton . Algo como:

 import Foundation import UIKit import ObjectiveC private var bgColorKey: UInt8 = 0 extension UIButton { var bgColor: UIColor { get { return objc_getAssociatedObject(self, &bgColorKey) as! UIColor } set (neewColor) { objc_setAssociatedObject(self, &bgColorKey, neewColor, .OBJC_ASSOCIATION_RETAIN) } } class func buttonWithFrame(f: CGRect, backgroundColor color: UIColor) -> UIButton { let button = UIButton(type: .Custom) button.frame = f button.backgroundColor = color; button.bgColor = color button.setImage(UIImage(named: "flips.png") as UIImage?, forState: .Normal) button.addTarget(button, action: "buttonTouched:", forControlEvents: .TouchUpInside) return button } func buttonTouched(sender: UIButton) { if sender.backgroundColor == UIColor.lightGrayColor() { sender.backgroundColor = sender.bgColor } else { sender.backgroundColor = UIColor.lightGrayColor() } } } 

Entonces puedes usar el button como:

 var btn = UIButton.buttonWithFrame(CGRectMake(50, 50, 100, 50), backgroundColor: UIColor.greenColor()) self.view.addSubview(btn) 

También encontré esto frustrante. Una subclass de UIButton completamente funcional, que solo es un defecto es setImage: La solución más fácil que he encontrado es escribir una pequeña class de ayudante para configurar la image desde el exterior:

 class ButtonImageHelper { func setImage(image: UIImage?, forButton:UIButton) { forButton.setImage(image, forState: UIControlState.Normal) } } 

Esta class puede ubicarse dentro de su subclass UIButton.
Para llamarlo:
ButtonImageHelper().setImage(yourImage, forButton:self)