2014-07-12 2 views
18

У меня есть UISwitch, что я хочу контролировать логическое значение в функции, которую я написал. Я посмотрел в справочном типе UISwitch и он перечислил свойство для включения/выключения переключателя как on. Я пытался использовать это в действии:Как связать логическое значение с состоянием включения/выключения UISwitch?

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

, но когда я запустил его и нажать кнопку, он разбился, и ничего не печатать.

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


} 
+2

Почему вы используете 'acsessabilitySwitch' вместо того,' sender' rgument? Возможно, вы забыли подключить свой IBOutlet. Кроме того, почему вы делаете «Bool (true)» вместо «true»? И, наконец, почему вы просто не делаете 'advice.isInProduction = sender.on'? – slazyk

ответ

12

лаконичность, даже скупость, важно в стиле кодирования. Попробуйте это:

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

В исходном коде, вы, вероятно, разбился из-за acsessabilitySwitch или advice развязаны (имеют значения nil).

+0

Я реализовал этот код, и он все еще разбился, когда я нажал на переключатель. Я отправлю полный код в вопросе. – user3832611

+2

Упреждайте предложение *** «Чрезвычайность, даже скупость, важна в стиле кодирования» *** и для существенной реализации. –

34

Добавить ссылку 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" 
    } 
} 

найти краткое руководство в http://sourcefreeze.com/uiswitch-tutorial-using-swift-in-ios8/

1

Если вы пытаетесь изменить переключатель вы можете использовать

mySwitch.on = true 

, чтобы установить его в положение " на " или

mySwitch.off == false 

, чтобы установить его в положение «выключено»

Или, если вы хотите, чтобы получить значение, которое вы можете использовать

let myBool = mySwitch.on 

Если переключатель питания на значение будет верно, в противном случае ложь ,

Вы также можете сделать акцию под названием ValueChanged (чтобы получить или обновить значение, когда значение переключателя изменяется)

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

Вы можете сделать это, выберите Dualview ...просмотр и ctrl перетащить с вашего коммутатора на ваш контроллер и выбрать действие, а значение изменилось, если оно еще не выбрано.

+1

Не отвечайте, если вы не понимаете вопрос – wruckie

3

Перетащите UISwitch от объекта Library-

@ IBOutlet-

@IBOutlet weak var myswitch: UISwitch! 

@ IBAction-

@IBAction func onAllAccessory(sender: UISwitch) { 

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

Ваш FUNCTION-

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

В Swift 3, есть случай.

if mySwitch.on 

в

if mySwitch.isOn 

myprint

3

Для быстрой 3

enter image description here

@IBAction func switchValueChanged(_ sender: UISwitch) { 
     print(sender.isOn) 
} 
Смежные вопросы