以编程方式将 class 添加到 Swift 中的 UIbutton

Programmatically add class to UIbutton in Swift

我是 Swift 的新手,对如何以编程方式将自定义 class 添加到按钮感到困惑。我创建了一个自定义 class 并可以使用故事板添加它。它工作正常,但是如何以编程方式完成呢?

我可以使用 CheckBox class 代替 UIButton 还是我仍然需要使用 UIButton 并添加 class?

Class

class CheckBox: UIButton {

//images
let checkedImage = UIImage(named: "checked_checkbox") //as UIImage!
let uncheckedImage = UIImage(named: "unchecked_checkbox") //as UIImage!

//bool property
var isChecked:Bool = false{
    didSet{
        if isChecked == true {
            self.setImage(checkedImage, forState: .Normal)
        }else {
            self.setImage(uncheckedImage, forState: .Normal)
        }

    }
}

override func awakeFromNib() {
    self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
    self.isChecked = false
}


func buttonClicked(sender:UIButton) {
    if(sender == self){
        if isChecked == true {
            println("setting to false")
            isChecked = false
        }else{
             println("setting to true")
            isChecked = true
        }
    }
}
}

将 class 添加到视图控制器

override func viewDidLoad() {
    super.viewDidLoad()

    let checkBox = CheckBox()

    checkBox.backgroundColor = UIColor.blueColor()
    self.view.addSubview(checkBox)

    checkBox.setTranslatesAutoresizingMaskIntoConstraints(false)


    self.view.addConstraint(NSLayoutConstraint(item: checkBox, attribute: .Left, relatedBy: .Equal, toItem: self.view, attribute: .Left, multiplier: 1.0, constant: 50))
    self.view.addConstraint(NSLayoutConstraint(item: checkBox, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Top, multiplier: 1.0, constant: 50))


}

the checkbox does not appear

会不会是因为您忘记给您的 checkbox 任何 size?

另外,我注意到你有这些图片:

let checkedImage = UIImage(named: "checked_checkbox") //as UIImage!
let uncheckedImage = UIImage(named: "unchecked_checkbox") //as UIImage!

但是会不会是您忘记将这些图像中的任何一个放入按钮?我没有看到任何执行此操作的代码。

If I call checkbox.isCheck = true or false the checkbox appears but does not change if clicked

可能是因为您忘记为您的 checkbox 控制事件提供任何目标操作?以前你有这个代码:

override func awakeFromNib() {
    self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
    self.isChecked = false
}

但现在没有 awakeFromNib 调用 - 此按钮不会从笔尖唤醒。故事板是笔尖。此按钮现在来自代码。

如果您修复它,以便调用该代码,那么 isChecked 将被设置并且图像将出现,不是吗?

如果您决定以编程方式(swift 2.2)而不是通过情节提要来执行此操作,请确保添加一个 override int 函数,一个 需要 init? 函数,并将以下内容放入 override init:

override init(frame: CGRect)
{
    super.init(frame: frame)
    self.addTarget(self, action: #selector(CheckBox.ButtonClicked(_:)),      
    forControlEvents: UIControlEvents.TouchUpInside)
    self.isChecked = false
    self.setImage(uncheckedImage, forState: .Normal)

}

required init?(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder)

}

重要的一点是 self.setImage。加载视图时无法显示图像。