Ho più pulsanti ognuno con la possibilità di cambiare la lingua dell'app. Invece di dover creare più IBActions per ogni pulsante, c'è un modo per averli tutti collegati a una IBAction e cambiare la lingua in base al pulsante premuto? Sto pensando che una dichiarazione di switch sarebbe utile in questa situazione, ma non è esattamente sicuro come configurarla.Come utilizzare una IBAction per più pulsanti in Swift?
risposta
In Interface Builder, selezionare l'ispettore attributi e impostare il tag per ogni pulsante con un numero unico, allora si può fare qualcosa di simile:
@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
}
}
Per collegare l'azione da più pulsanti: in Interface Builder, fare clic con il tasto destro del mouse su ViewController nella gerarchia della vista, quindi fare clic con il tasto sinistro del mouse per trascinare la connessione dell'azione su ciascun pulsante.
Come puoi collegare ciascun pulsante all'azione nello storyboard? Non mi consentirà di fare clic sul pulsante e trascinare su IBAction. – SwiftyJD
in Interface Builder, fare clic con il tasto destro del mouse su 'ViewController' nella gerarchia della vista, quindi fare clic con il tasto sinistro per trascinare la connessione di azione su ciascun pulsante. –
ok, capito, grazie! – SwiftyJD
Sì, una dichiarazione switch è la strada da percorrere qui. Per un UIButton, lo si collega a un selettore che viene chiamato quando l'utente interagisce con il pulsante, generalmente l'evento TouchUpInside. The addTarget method, and valid selector signatures (apple.com) Di questi, si desidera utilizzare un metodo nel formato @IBAction func doSomething(sender: UIButton)
o @IBAction func doSomething(sender: UIButton, forEvent event: UIEvent)
, in modo che un riferimento al pulsante che ha attivato l'evento sia passato al selettore.
Nel codice ViewController, avrete i riferimenti ai tuoi UIButtons (possibilmente in uno storyboard, o create manualmente.) Diciamo che avete
@IBOutlet weak var frenchButton: UIButton!
@IBOutlet weak var spanishButton: UIButton!
@IBOutlet weak var englishButton: UIButton!
Si potrebbe collegare tutti loro per lo stesso metodo, e diramare la logica in base alla quale si era il mittente. es .:
@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
}
}
Nota: le dichiarazioni caso Swift devono essere esaustivo, quindi bisogna includere un caso di default, anche se non dovrebbe mai essere chiamato.
non mi piace per impostare tag, se siamo in grado di risolverlo senza tag
@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 {
}
}
Sì, la sua buona idea; D –
Qualsiasi idea di come impostare uno fino che gestisce ibactions? – SwiftyJD
il mittente ha molte proprietà: titolo, tag e altro. puoi anche creare la tua classe pulsante personalizzata con la proprietà di identificazione. –