web-dev-qa-db-fra.com

UISwitch: Swift 3: Programmatique

Comment puis-je ajouter par programme un commutateur uis et appeler une action quand elle est activée et une autre quand elle est désactivée? Je cherche depuis des heures maintenant. Puis-je s'il vous plaît avoir de l'aide? Je sais comment ajouter le commutateur, mais il reste à l'écran quelle que soit la scène dans laquelle je suis. Jusqu'à présent, j'ai pu ajouter le bouton et le faire passer de activé à désactivé, mais pour une raison quelconque, le commutateur indique uniquement l'écran à chaque scène. J'étais perdu après cela alors j'ai suivi ceci; from Comment mettre par programme un UISwitch dans un SpriteKit/Skcene

Oui c'est possible. Utilisez simplement ce code dans votre classe 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)
}

Méthode d'assistance:

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

Comme je continuais à avoir des erreurs, j’ai fait ce que Xcode avait suggéré, ce qui a abouti à l’erreur SIGBART.

12
Robert Smith

Vous appelez le sélecteur incorrect sur la ligne d'action addTarget. Ils l'ont finalement changé à un moment donné dans Swift 2 pour se débarrasser de l'utilisation de chaînes de caractères pour les appels de méthode de sélecteur, ce qui les rend désormais moins sujettes aux erreurs.

Changez-le en ceci (syntaxe Swift 3)

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

En gros, vous appelez #selector dans le paramètre action et incluez la méthode à appeler, dans votre cas, switchValueDidChange. Notez la syntaxe (_ :) à la fin, ce qui indique que la méthode que vous voulez appeler prend un paramètre, dans votre cas un UISwitch.

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

Si vous souhaitez appeler une méthode standard sans paramètres, par exemple

 func switchValueDidChange() {
 }

que tu dirais 

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

sans la syntaxe (_ :).

J'espère que cela t'aides

20
crashoverride777

Avec paramètre:

@IBOutlet var categorySwitch:UISwitch!

var categorySwitchIsOn:Bool =  false

Sur viewDidLoad:

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

Fonction associée:

func categorySwitchValueChanged(_ sender : UISwitch!){

    if sender.isOn {
        categorySwitchIsOn =  true

    } else {

        categorySwitchIsOn =  false
    }


}
0
A.G