【问题标题】:Programmatically add class to UIbutton in Swift以编程方式将类添加到 Swift 中的 UIbutton
【发布时间】:2015-07-05 01:29:26
【问题描述】:

我是 Swift 新手,对如何以编程方式将自定义类添加到按钮感到困惑。我创建了一个自定义类,可以使用情节提要添加它。它工作正常,但如何以编程方式完成?

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

班级

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

将类添加到视图控制器

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


}

【问题讨论】:

  • 您可以在代码中使用 Checkbox 类代替 UIButton
  • @TienDinh 谢谢!我的问题一定是我的班级或者我将 Checkbox 类添加到视图控制器的方式。我更新了问题以包括 viewDidLoad 和类。我是否遗漏了如何以编程方式添加 UIButton 与在情节提要中添加 UIButton 的区别?
  • “我的问题一定是我的班级或者我将 Checkbox 类添加到视图控制器的方式”但是@Oakland510,你还没有解释你的问题是什么!复选框没有出现在界面中吗?有什么问题会发生或没有发生?
  • @matt 复选框没有出现。如果我调用 checkbox.isCheck = true 或 false 复选框会出现,但如果单击则不会更改。如果我通过情节提要添加按钮并将自定义类设置为 CheckBox,则会出现复选框并在单击时更改。
  • @matt 即使使用 checkBox.frame = CGRectMake(30, 30, 100, 100) 我仍然一无所获。如果我设置 checkBox.backgroundColor = UIColor.blueColor() 我至少可以让一个蓝色框出现,这是正确的大小。但是它仍然不是我期望的复选框。

标签: iphone swift uibutton


【解决方案1】:

复选框没有出现

可能是因为您忘记给您的checkbox 提供任何大小

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

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

但是您是否忘记将这些图像中的任何一个放在按钮中?我没有看到任何这样做的代码。

如果我调用 checkbox.isCheck = truefalse,复选框会出现,但如果单击则不会更改

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

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

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

如果你解决了这个问题,这样代码就会被调用,那么isChecked 将被设置并且图像会出现,不是吗?

【讨论】:

  • “故事板就是笔尖”可以解释很多。设置大小似乎没有帮助。如果我设置了大小和背景颜色,我只会得到一个按钮,它是没有复选框图像的预期颜色和大小。有没有更好的功能可以将 awakeFromNib 的内容移动到?我假设我可以将其移至 viewDidLoad,但宁愿将其保留在类本身中。
  • 您说的是let checkBox = CheckBox(),所以您正在调用CheckBox init() 方法。所以这大概是放置被调用的代码的地方。
【解决方案2】:

如果您决定以编程方式(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。加载视图时,我无法显示图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多