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.

2 ответов


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

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

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

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

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

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

 func switchValueDidChange() {
 }

чем вы бы просто сказали

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

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

надеюсь, что это помогает


параметр:

@IBOutlet var categorySwitch:UISwitch!

var categorySwitchIsOn:Bool =  false

на viewDidLoad:

  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
    }


}