2016-06-16 23 views
5

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?

+0

Sì, la sua buona idea; D –

+0

Qualsiasi idea di come impostare uno fino che gestisce ibactions? – SwiftyJD

+0

il mittente ha molte proprietà: titolo, tag e altro. puoi anche creare la tua classe pulsante personalizzata con la proprietà di identificazione. –

risposta

19

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.

+1

Come puoi collegare ciascun pulsante all'azione nello storyboard? Non mi consentirà di fare clic sul pulsante e trascinare su IBAction. – SwiftyJD

+4

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. –

+1

ok, capito, grazie! – SwiftyJD

6

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.

3

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 { 

    } 
}