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

Swift - Passing boolean between view controllers

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

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

有什么建议吗?我不认为我可以使用标识符来使用 prepareforsegue。

自定义UIButton的

Class

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

}

好的,不要将变量移到 class 之外,而是创建一个名为 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
        }
    }
}

}

然后在另一个class中使用isCheckGlobal来访问isChecked

的值

为什么要使用全局变量?特别是当你的 isChecked 属性,从你的按钮,是 public 你可以访问它。

从那里,您可以使用 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()
    }

}

第二个ViewController :

import UIKit

class SecondViewController: UIViewController {

    var isChecked : Bool?

    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

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

}

希望对您有所帮助。

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

复选框:

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

}

第二ViewController :

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

}

故事板:

它能解决您的问题吗?