Swift - 在视图控制器之间传递布尔值

时间:2015-02-19 01:53:55

标签: xcode swift uibutton viewcontroller

我创建了一个按钮。这是一个自定义按钮,显示未选中框的图像。当用户单击按钮时,图像将变为复选框,反之亦然,当用户再次单击它时。选中框时,布尔值为true,未选中时为布尔值。

我的目标是在用户单击按钮时尝试将此布尔值true或false传递给另一个视图控制器以执行其他任务。

有什么建议吗?我认为我不能使用使用标识符的prepareforsegue。

自定义UIButton的类

import UIKit

class CheckBox1: UIButton {

    //images
    let checkedImage = UIImage(named: "checked")
    let unCheckedImage = UIImage(named: "unchecked")

    //bool propety
    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
            }
        }
    }

}

3 个答案:

答案 0 :(得分:0)

为什么要使用全局变量?特别是当您的isChecked媒体资源已公开时,您可以访问它。

从那里,您可以使用prepareForSegue方法。

复选框:保持原样

ViewController:

import UIKit

class ViewController: UIViewController {

    @IBOutlet var myCheckBox: CheckBox!

    override func viewDidLoad() {
        super.viewDidLoad()
        // ...
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Make sure you created the segue in the storyboard and match it's identifier name
        if (segue.identifier == "firstToSecondVCSegue") {
            let secondVC : SecondViewController = segue.destinationViewController as SecondViewController
            secondVC.isChecked = myCheckBox.isChecked
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

SecondViewController:

import UIKit

class SecondViewController: UIViewController {

    var isChecked : Bool?

    override func viewDidLoad() {
        super.viewDidLoad()

        println("isChecked status : \(self.isChecked)")

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

我希望它有所帮助。

答案 1 :(得分:0)

所以,除了我以前的评论和你的评论之外,这里是一个在展开segue后更改UILabel的例子。

复选框:

import UIKit

class CheckBox: UIButton {

    //images
    let checkedImage = UIImage(named: "checked")
    let unCheckedImage = UIImage(named: "unchecked")

    //bool propety
    var isChecked:Bool = false {
        didSet {
            if (self.isChecked) {
                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
            }
        }
    }

}

ViewController:

import UIKit

class ViewController: UIViewController {

    var isChecked : Bool?
    @IBOutlet var isCheckedLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Here, you could pass the status each time you access the secondVC.
    }

    @IBAction func unwindFromSecondVC(segue: UIStoryboardSegue) {
        let secondVC : SecondViewController = segue.sourceViewController as SecondViewController
        self.isChecked = secondVC.myCheckBox.isChecked

        self.isCheckedLabel.text = self.isChecked?.description
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

SecondViewController:

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet var myCheckBox: CheckBox!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // You can do stuff here if needed.
        // But in your case, see firstVC.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

故事板: Storyboard

它能回答你的问题吗?

答案 2 :(得分:-1)

确定而不是将变量移到类外,创建一个名为isCheckedGlobal的新变量或者与isChecked不同的东西。

import UIKit

var isCheckedGlobal = Bool() // !! Global Variable // You might need to change '= Bool()' to '= false' or '= true'

class CheckBox1: UIButton {

//images
let checkedImage = UIImage(named: "checked")
let unCheckedImage = UIImage(named: "unchecked")

//bool propety
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 
            isCheckedGlobal = false // !! Set variable's value
        }else{
            isChecked = true
            isCheckedGlobal = true // !! Set variable's value
        }
    }
}

}

然后在另一个类中使用isCheckGlobal来访问isChecked的值