【问题标题】:How to add custom UIButton programmatically swift如何以编程方式快速添加自定义 UIButton
【发布时间】:2016-01-20 20:58:20
【问题描述】:

我能够创建一个自定义复选框按钮类。但是,当我尝试将按钮放在我的视图中时,我没有得到图像。设置背景颜色只是返回该大小的正方形。这是我添加框的代码:

     let box:CheckBox = CheckBox()
     box.frame = CGRectMake(screenSize.width/2, screenSize.height/2, 200, 200)
     self.view.addSubview(box)

I created the class as follows:

class CheckBox: UIButton {
    override init(frame: CGRect) {
        super.init(frame: frame)
        //other stuff
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    // Images
    let checkedImage = UIImage(named: "checked_checkbox")
    let uncheckedImage = UIImage(named: "checkbox_unchecked_icon")

    // 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 {
                isChecked = false
            } else {
                isChecked = true
            }
        }
    }
}

【问题讨论】:

  • 你不是从 XIB 文件创建你的复选框实例,所以 awakeFromNib 永远不会被调用。
  • @Bastek awakeFromNib 中的代码应该去哪里?
  • 请不要在您的问题中“修复”您的代码。如果您有答案,您需要将其发布为作为答案,并保留您的问题。

标签: ios swift class uibutton


【解决方案1】:

将您的 awakeFromNib 代码移至您的 init()awakeFromNib 仅在您从 nib/xib 文件初始化时调用。

这永远不会被调用。您可以通过设置断点来测试它。

它应该是这样的:

override init(frame: CGRect) {
    super.init(frame: frame)
    self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
    self.isChecked = false
}

这样,self.isChecked 被调用,图像被设置,你会看到更多的灰色框。

【讨论】:

  • 对不起,这是我的错。我的意思是从所有人中删除“吸烟者”这个词,因为它是一个检查一个人是否吸烟的盒子。但吸烟者随处可见
  • 那么我可以看到的另一件事是您应该将您的awakeFromNib 代码移动到init。这就是您使用CheckBox() 时所调用的内容。我会更新
  • 这似乎行得通!谢谢!我只有一个问题。当视图最初加载时,没有图像显示,它只是一个带有我设置的背景颜色的框。如何让未选中的框立即显示?
猜你喜欢
  • 2016-07-27
  • 1970-01-01
  • 2020-09-23
  • 2015-09-24
  • 1970-01-01
  • 2014-12-18
  • 2014-12-07
  • 2017-09-29
相关资源
最近更新 更多