如何将布尔值链接到UISwitch的开/关状态?

时间:2014-07-12 16:22:50

标签: ios swift

我有一个UISwitch,我想在我写的函数中控制一个布尔值。我查看了UISwitch类型参考,它将交换机的开/关状态的属性列为on。我尝试在动作中使用它:

@IBAction func switchValueChanged(sender: UISwitch) {
        if acsessabilitySwitch.on {
//accessibilitySwitch is the UISwitch in question 
            println("It's True!")
            advice.isInProduction = Bool (true) 
// isInProduction is a attribute of a class
        } else {
            println("It's False!")
            advice.isInProduction = Bool (false)
        }

但是当我跑到它并按下开关时它崩溃了,没有打印任何东西。

编辑: 这是我的ViewController和我的自定义类文件:

BuyingAdviceModel.swift:

import Foundation
class videoGameModel{
    var price : Double
    var isInProduction : Bool
    var adviceGiven: String?
    init (isInProduction : Bool, price: Double){
        self.price = price
        self.isInProduction = isInProduction
    }
    func giveAdvice (price:Double, isInProduction:Bool)->(adviceGiven:String){
            if price >= 199.99 {
                var adviceGiven = "Nope, that's too expensive!"
                return adviceGiven
            } else if price <= 99.99{
                if isInProduction == true {
                    var adviceGiven = ("Buy it at GameStop!")
                    return adviceGiven
                } else {
                    var adviceGiven = ("Go look online!")
                    return adviceGiven
                }
            } else {
                var adviceGiven = ("Are you sure you put the info in correctly?")
                return adviceGiven
            }
    }
}

ViewController.swift:

import UIKit
import Foundation
class ViewController: UIViewController {
    @IBOutlet var priceTextField: UITextField
    @IBAction func adviceButtonTapped(sender: AnyObject) {
        let adviceOutputed = advice.adviceGiven!
        adviceLabel.text=adviceOutputed
    }
    @IBAction func viewTapped(sender: AnyObject) {
        priceTextField.resignFirstResponder()
    }

     @IBOutlet var acsessabilitySwitch: UISwitch
     @IBOutlet var adviceLabel: UILabel
     @IBAction func switchValueChanged (sender: UISwitch) {
        advice.isInProduction = sender.on
        println ("It's " + advice.isInProduction.description + "!")
    }
    var advice = videoGameModel (isInProduction: true,price: 0.00)
    func refreshUI(){
        priceTextField.text = String(advice.price)
        adviceLabel.text = ""
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        refreshUI()
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }


}

7 个答案:

答案 0 :(得分:41)

将UISwitch Reference添加到ViewController.swift文件中。

@IBOutlet var mySwitch: UISwitch 
@IBOutlet var switchState: UILabel

然后将目标事件添加到viewdidload方法中,如下所示

mySwitch.addTarget(self, action: #selector(ViewController.switchIsChanged(_:)), forControlEvents: UIControlEvents.ValueChanged)

当翻转开关时,会触发UIControlEventValueChanged事件并调用stateChanged方法。

func switchIsChanged(mySwitch: UISwitch) {
    if mySwitch.on {
        switchState.text = "UISwitch is ON"
    } else {
        switchState.text = "UISwitch is OFF"
    }
}

Swift 3.0

func switchIsChanged(mySwitch: UISwitch) {
    if mySwitch.isOn {
        switchState.text = "UISwitch is ON"
    } else {
        switchState.text = "UISwitch is OFF"
    }
}

Swift 4.0

@objc func switchIsChanged(mySwitch: UISwitch) {
    if mySwitch.isOn {
        switchState.text = "UISwitch is ON"
    } else {
        switchState.text = "UISwitch is OFF"
    }
}

http://sourcefreeze.com/uiswitch-tutorial-using-swift-in-ios8/

中找到简要教程

答案 1 :(得分:18)

简洁,即使是简约,在编码风格中也很重要。试试这个:

@IBAction func switchValueChanged (sender: UISwitch) {
  advice.isInProduction = sender.on
  print ("It's \(advice.isInProduction)!")
}

在原始代码中,由于acsessabilitySwitchadvice未绑定(值为nil),您可能会崩溃。

[已更新 - 已将println替换为print]

答案 2 :(得分:5)

对于swift 3

enter image description here

@IBAction func switchValueChanged(_ sender: UISwitch) {
        print(sender.isOn)
}

答案 3 :(得分:4)

从对象库中拖放UISwitch -

@IBOutlet -

@IBOutlet weak var myswitch: UISwitch!

@IBAction -

@IBAction func onAllAccessory(sender: UISwitch) {

        if myswitch.on == true{
            onCall()
        }
        if myswitch.on == false{
            offCall()
        }
    }

你的功能 -

func onCall(){
        print("On is calling")
    }
    func offCall(){
        print("Off is calling")
    }

答案 4 :(得分:2)

如果您尝试更改开关,可以使用

mySwitch.on = true

将其设置为“on” 或

mySwitch.off == false

将其设为“关闭”

或者,如果您想获得可以使用的值

let myBool = mySwitch.on

如果开关已接通电源,则该值为true,否则为false。

您还可以创建一个名为valueChanged的操作(每当更改切换值时获取或更新值)

@IBAction func valueChanged(sender: AnyObject) {
    // some code
}

您可以通过选择双视图...视图并按住Ctrl键从您的开关拖动到您查看控制器并选择操作,如果尚未选择该值,则更改值。

答案 5 :(得分:2)

在Swift 3中,是机会。

if mySwitch.on

if mySwitch.isOn

myprint

答案 6 :(得分:1)

不需要多余的布尔值。
使用这个:

if mySwitch.isOn {
  // do something
} else {
  // do something else
}

这是开关状态的始终为最新的布尔值,因此不需要可以创建自己的变量。