web-dev-qa-db-ja.com

UISwitch:Swift 3:プログラムで

Uiswitchをプログラムで追加し、オンのときとオフのときのアクションを呼び出すにはどうすればよいですか?今何時間も探しています。助けてもらえますか?スイッチを追加する方法は知っていますが、どのシーンにいても画面に表示されたままになります。これまで、ボタンを追加してオンからオフに切り替えることができましたが、何らかの理由で、スイッチはすべてのシーンで画面上に表示するだけです。その後、道に迷ったので、これに従いました。 from ISwitchを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エラーになりました。

15
Robert Smith

AddTargetアクション行でセレクターを間違って呼び出しています。最終的にSwift 2の1点で変更し、セレクターメソッド呼び出しに文字列を使用しないようにしました。これにより、エラーが発生しにくくなりました。

これに変更します(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)

(_ :)構文なし。

お役に立てれば

24

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")
    }
}
2
DaniChi

パラメーター付き:

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


}
1
A.G