J'ai plusieurs boutons chacun avec la possibilité de changer la langue de l'application. Au lieu d'avoir à créer plusieurs IBActions pour chaque bouton, existe-t-il un moyen de les connecter tous à une IBAction et de changer la langue en fonction du bouton enfoncé? Je pense qu'une déclaration de commutateur serait utile à utiliser dans cette situation, mais je ne sais pas exactement comment la configurer.
Dans Interface Builder, sélectionnez l'inspecteur d'attributs et définissez la balise pour chaque bouton avec un numéro unique, puis vous pouvez faire quelque chose comme ceci:
@IBAction changeLanguage(sender: AnyObject) {
guard let button = sender as? UIButton else {
return
}
switch button.tag {
case 1:
// Change to English
case 2:
// Change to Spanish
case 3:
// Change to French, etc
default:
print("Unknown language")
return
}
}
Pour connecter l'action à plusieurs boutons: dans Interface Builder, cliquez avec le bouton droit sur ViewController dans la hiérarchie des vues, puis cliquez avec le bouton gauche pour faire glisser la connexion d'action vers chaque bouton.
Oui, une instruction switch est la voie à suivre ici. Pour un UIButton, vous le liez à un sélecteur qui est appelé lorsque l'utilisateur interagit avec le bouton, généralement l'événement TouchUpInside. La méthode addTarget et les signatures de sélecteurs valides (Apple.com) Parmi celles-ci, vous souhaitez utiliser une méthode au format @IBAction func doSomething(sender: UIButton)
ou @IBAction func doSomething(sender: UIButton, forEvent event: UIEvent)
, de sorte que une référence au bouton qui a déclenché l'événement est transmise au sélecteur.
Dans votre code ViewController, vous aurez des références à vos boutons UIB (éventuellement dans un storyboard ou créés manuellement.) Disons que vous avez
@IBOutlet weak var frenchButton: UIButton!
@IBOutlet weak var spanishButton: UIButton!
@IBOutlet weak var englishButton: UIButton!
Vous devez tous les connecter à la même méthode et brancher la logique en fonction de l'expéditeur. par exemple.:
@IBAction func changeLanguage(sender: UIButton) {
switch sender {
case frenchButton:
// Change Language to French
print ("C'est si bon")
case spanishButton:
// or Spanish
print ("Muy Bueno")
case englishButton:
// or English
print ("It's pretty cool")
default:
break
}
}
Remarque: Les instructions case dans Swift doivent être exhaustives, vous devez donc inclure un cas par défaut, même s'il ne doit jamais être appelé.
Vous pouvez simplement comparer la référence au lieu des balises. De cette façon, vous n'introduirez pas de nouveau bogue, car contrairement à une balise que vous tapez vous-même, la référence est créée automatiquement par le compilateur.
@IBOutlet weak var firstButton: UIButton!
@IBOutlet weak var secondButton: UIButton!
@IBOutlet weak var thirdButton: UIButton!
@IBAction changeLanguage(sender: UIButton) {
if sender == firstButton {
} else if sender == secondButton {
} else if sender == thirdButton {
}
}