2016-08-01 6 views
1

Ich habe eine benutzerdefinierte Option mit der Taste durch eine Klasse von UIButton creatin hier ist die KlasseSet CheckBox Ein - Aus

import UIKit 

class CheckBox: UIButton { 
    // Images 
    let checkedImage = UIImage(named: "ic_check_box")! as UIImage 
    let uncheckedImage = UIImage(named: "ic_check_box_outline_blank")! 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 { 
      isChecked = !isChecked 
     } 
    } 
} 

Ich habe zwei Kontrollkästchen in der Viewcontroller, aber ich weiß nicht, wie Checkbox in der einzustellen ViewController.class zu tun, wenn checkBox "Si" aktiviert ist, muss die Checkbox "Nein" nicht markiert, wie im Bild

Checkbox Si

Checkbox No

Antwort

0

Ihre Klasse CheckBox sollte ein Delegierungsmuster übernehmen, damit sie ihrem Delegaten (der in diesem Fall der View-Controller wäre) mitteilen würde, dass sich der Wert geändert hat. Dann in Ihrem View-Controller können Sie die anderen Kontrollkästchen aktualisieren bei Bedarf:

protocol CheckBoxDelegate { 
    func checkBoxDidChange(checkbox: CheckBox) -> Void 
} 

class CheckBox: UIButton { 
    // Images 
    let checkedImage = UIImage(named: "ic_check_box")! as UIImage 
    let uncheckedImage = UIImage(named: "ic_check_box_outline_blank")! as UIImage 

    weak var delegate: CheckBoxDelegate? 
    // 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) { 
     isChecked = !isChecked 
     self.delegate?.checkBoxDidChange(self) 
    } 
} 

Dann in Ihrer View-Controller:

class ViewController: UIViewController, CheckBoxDelegate { 

    @IBOutlet var siCheckBox: CheckBox! // Initialise some other way if you aren't using storyboard/nib 
    @IBOutlet var noCheckBox: CheckBox! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.siCheckBox.delegate = self 
     self.noCheckBox.delegate = self 
    } 

    //Mark: CheckBoxDelegate 

    func checkBoxDidChange(checkbox: CheckBox) { 
     if checkbox == self.siCheckBox { 
      self.noCheckBox.isChecked = !checkbox.isChecked 
     } else { 
      self.siCheckBox.isChecked = !checkbox.isChecked 
     } 
    } 

Von einem User Experience Sicht, würde ich fragen, warum Sie beide brauchen Kontrollkästchen. Ein Kontrollkästchen ist ein An/Aus-Steuerelement, so dass Sie normalerweise Text wie "Wählen Sie wirklich große Option?" mit einem einzigen Kontrollkästchen für Ja/Nein; checked is yes, unchecked ist nein.

+0

"Aus Sicht des Benutzererlebnisses würde ich fragen, warum Sie beide Checkboxen benötigen" U sind richtig, aber ist, weil der Kunde die Anwendung irgendwann möchte, Übrigens, thx für das Beispiel werde ich es testen –

0

Ich würde func buttonClicked(sender: UIButton) auf den übergeordneten ViewController verschieben.

let siCheckBox = CheckBox() 
let noCheckBox = CheckBox() 

func checkBoxToggled(sender: AnyObject) { 
    noCheckbox.isChecked = !noCheckbox.isChecked 
    siCheckbox.isChecked = !siCheckbox.isChecked 
} 

Dies ist nur sicher, wenn Sie sicher sind, dass mindestens 1 immer überprüft wird. Ansonsten würde ich eine if Anweisung hinzufügen, um sicherzustellen, dass bei l überprüft wird.

+0

thx für das Beispiel werde ich es testen: D –