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()
}
}
故事板:
它能解决您的问题吗?
我创建了一个按钮。这是一个自定义按钮,显示未选中框的图像。当用户单击该按钮时,图像变为一个选中框,当用户再次单击它时反之亦然。选中框时布尔值为 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()
}
}
故事板:
它能解决您的问题吗?