2015-07-05 4 views
1

Я новичок в Swift и смущен тем, как программно добавлять пользовательский класс к кнопке. Я создал пользовательский класс и могу добавить его с помощью раскадровки. Он отлично работает, но как это сделать программно?Программно добавить класс в UIbutton в Swift

enter image description here

Могу ли я использовать класс 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)) 


} 
+1

Вы можете использовать свой класс Checkbox вместо UIButton в своем коде –

+0

@TienDinh Спасибо! Моя проблема должна быть с моим классом тогда или с тем, как я добавляю класс Checkbox к контроллеру представления. Я обновил вопрос, включив viewDidLoad и класс. Я что-то упускаю из-за различий в том, как добавлять UIButton программно и в раскадровку? – Oakland510

+0

«Моя проблема должна быть с моим классом тогда или с тем, как я добавляю класс Checkbox в контроллер вида« Но @ Oakland510, вы не объяснили, что ваша проблема _is_! Не отображается ли флажок в интерфейсе? Что происходит или не происходит, что проблематично? – matt

ответ

3

флажок не отображается

Может ли это быть потому, что вы забыли дать ваш checkbox любой размер?

Кроме того, я заметил, у вас есть эти изображения:

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

Но может быть, вы забыли поставить любого из этих изображений в кнопке? Я не вижу никакого кода, который это делает.

Если я позвоню checkbox.isCheck = true или false появляется флажок, но не изменяется при нажатии

Может ли это быть потому, что вы забыли дать ваш checkbox любую целевую-акцию для своего мероприятия управления? Ранее вы имели этот код:

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

Но теперь нет awakeFromNib вызова - эта кнопка не будит от кончика пера. Раскадровка - это ниб. Теперь эта кнопка исходит из кода.

Если вы исправите это, чтобы вызвать этот код, тогда будет установлено isChecked, и изображение появится, не так ли?

+0

«Раскадровка - это ниб», объяснят многое. Настройка размера не помогает. Если я задаю размер и цвет фона, я просто получаю кнопку цвет и размер, ожидаемый без изображения флажка. Есть ли лучшая функция, с которой я мог бы перемещать содержимое awakeFromNib? Я предполагаю, что могу перенести его в viewDidLoad, но скорее сохранил бы его внутри самого класса. – Oakland510

+1

Вы говорите «let checkBox = CheckBox()», поэтому вы вызываете метод init() 'CheckBox. Таким образом, предположительно, это место, где можно было бы называть этот код, который будет называться _will_. – matt

0

Если вы решили сделать это программно (скоро 2,2), а не с помощью раскадровки, убедитесь, что вы добавить переопределения INT функцию, а требуемых инициализации? функции, и поместите в вашей переопределение инициализации:

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. Я не мог заставить изображения появляться при загрузке представления.