Как связать логическое значение с состоянием включения/выключения UISwitch?
У меня есть UISwitch
, который я хочу контролировать логическое значение в функции, которую я написал. Я посмотрел в типе UISwitch
Reference Type, и он перечислил свойство для включения/выключения этого переключателя как on
. Я попытался использовать это в действии:
@IBAction func switchValueChanged(sender: UISwitch) {
if acsessabilitySwitch.on {
//accessibilitySwitch is the UISwitch in question
println("It True!")
advice.isInProduction = Bool (true)
// isInProduction is a attribute of a class
} else {
println("It False!")
advice.isInProduction = Bool (false)
}
но когда я запустил его и нажал на переключатель, он разбился и ничего не печатал.
EDIT:
Вот мой 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 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 " + 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.
}
}
Ответы
Ответ 1
Добавьте ссылку UISwitch в файл 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/
Ответ 2
Краткость, даже скупость, важна в стиле кодирования. Попробуй это:
@IBAction func switchValueChanged (sender: UISwitch) {
advice.isInProduction = sender.on
print ("It \(advice.isInProduction)!")
}
В исходном коде вы, вероятно, потерпели крах, потому что acsessabilitySwitch
или advice
связаны (имеют значения nil
).
[Обновлено - заменено println
на print
]
Ответ 3
Для быстрой 3
![enter image description here]()
@IBAction func switchValueChanged(_ sender: UISwitch) {
print(sender.isOn)
}
Ответ 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")
}
Ответ 5
Если вы пытаетесь изменить переключатель, вы можете использовать
mySwitch.on = true
установить его на "вкл" или
mySwitch.off == false
установить его на "выкл"
Или, если вы хотите получить значение, которое вы можете использовать
let myBool = mySwitch.on
Если коммутатор включен, значение будет истинным, в противном случае - ложным.
Вы также можете выполнить действие с именем valueChanged (чтобы получить или обновить значение при каждом изменении значения переключателя)
@IBAction func valueChanged(sender: AnyObject) {
// some code
}
Вы можете сделать это, выбрав dualView... view и ctrl drag от вашего переключателя до контроллера view и выбрав action, а значение изменилось, если оно еще не выбрано.
Ответ 6
В Swift 3 есть шанс.
if mySwitch.on
to
if mySwitch.isOn
myprint
Ответ 7
Нет необходимости в дополнительных логических.
использовать этот:
if mySwitch.isOn {
// do something
} else {
// do something else
}
Это всегда актуальное логическое значение для состояния переключателя, поэтому НЕ НУЖНО создавать свою собственную переменную.