Подтвердить что ты не робот

UISwitch: Swift 3: программно

Как я могу программно добавить uiswitch и вызывать действие, когда включено, и одно, когда выключено? Я искал часы. Могу ли я, пожалуйста, помочь? Я знаю, как добавить переключатель, но он остается на экране независимо от того, на какой сцене я нахожусь. До сих пор я мог добавить кнопку и переключить ее с одного на другой, но по какой-то причине коммутатор просто говорит на экране в каждой сцене. Я потерялся после этого, поэтому я последовал этому; от Как программно поставить UISwitch в SpriteKit/Skcene

Да, это возможно. Просто используйте этот код в своем классе SKScene:

override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    let switchDemo = UISwitch(frame:CGRectMake(150, 300, 0, 0))
    switchDemo.on = true
    switchDemo.setOn(true, animated: false)
    switchDemo.addTarget(self, action: "switchValueDidChange:", forControlEvents: .ValueChanged)
    self.view!.addSubview(switchDemo)
}

Вспомогательный метод:

func switchValueDidChange(sender:UISwitch!)
{
    if (sender.on == true){
        print("on")
    }
    else{
        print("off")
    }
}

Я продолжал получать ошибки, поэтому я сделал то, что предложил Xcode, который закончил с ошибкой SIGBART.

4b9b3361

Ответ 1

Вы неправильно вызываете селектор в строке действия addTarget. Наконец, они изменили его в одном месте в Swift 2, чтобы избавиться от использования строк для вызовов метода выбора, что теперь делает их намного менее подверженными ошибкам.

Измените его на это (синтаксис Swift 3)

switchDemo.addTarget(self, action: #selector(switchValueDidChange(_:)), for: .valueChanged)

В основном вы вызываете #selector в параметре действия и включаете метод, который хотите вызвать, в вашем случае switchValueDidChange. Обратите внимание на синтаксис (_:) в конце, который указывает, что метод, который вы хотите вызвать, принимает параметр, в вашем случае UISwitch.

 func switchValueDidChange(_ sender: UISwitch) {
     ...
 }

Если вы хотите вызвать обычный метод, который не принимает никаких параметров, например

 func switchValueDidChange() {
 }

чем вы просто скажете

switchDemo.addTarget(self, action: #selector(switchValueDidChange), for: .valueChanged)

без синтаксиса (_:).

Надеюсь, что это поможет

Ответ 2

С параметром

@IBOutlet var categorySwitch:UISwitch!

var categorySwitchIsOn:Bool =  false

В режиме просмотраDidLoad:

  override func viewDidLoad() {
        super.viewDidLoad()
        categorySwitch.addTarget(self, action:#selector(ViewController.categorySwitchValueChanged(_:)), for: .valueChanged)
    }

Связанная функция:

func categorySwitchValueChanged(_ sender : UISwitch!){

    if sender.isOn {
        categorySwitchIsOn =  true

    } else {

        categorySwitchIsOn =  false
    }


}

Ответ 3

Обновлено до Swift 5

override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    let switchDemo = UISwitch(frame:CGRect(x: 150, y: 300, width: 0, height: 0))
    switchDemo.isOn = true
    switchDemo.setOn(true, animated: false)
    switchDemo.addTarget(self, action: #selector(switchValueDidChange(_:)), for: .valueChanged)
    self.view!.addSubview(switchDemo)
}

Вспомогательный метод:

@objc func switchValueDidChange(_ sender: UISwitch!) {
    if (sender.isOn == true){
        print("on")
    }
    else{
        print("off")
    }
}