Mam wiele przycisków, każdy z możliwością zmiany języka aplikacji. Zamiast konieczności tworzenia wielu IBActions dla każdego przycisku istnieje sposób, aby je wszystkie połączone z jednym IBAction i zmienić język w oparciu o naciśnięty przycisk? Myślę, że w takiej sytuacji dobrze byłoby użyć instrukcji zmiany, ale nie jestem do końca pewna, jak ją skonfigurować.Jak używać jednej IBAction dla wielu przycisków w Swift?
Odpowiedz
interfejs Builder wybierz Inspektor atrybutów i ustawić znacznik do każdego przycisku z unikalnym numerem, można zrobić coś takiego:
@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
}
}
Aby połączyć działania na wielu przycisków: w Program Interface Builder, kliknij prawym przyciskiem myszy ViewController w hierarchii widoku, a następnie kliknij lewym przyciskiem myszy, aby przeciągnąć połączenie akcji do każdego przycisku.
Jak podłączyć każdy przycisk do akcji w scenopisie? Nie pozwoli mi kliknąć przycisku i przeciągnąć do IBAction. – SwiftyJD
w Kreatorze interfejsów, kliknij prawym przyciskiem myszy 'ViewController' w hierarchii widoku, a następnie kliknij lewym przyciskiem myszy, aby przeciągnąć połączenie akcji do każdego przycisku –
ok, rozumiem, dzięki! – SwiftyJD
Tak, instrukcja zmiany jest tutaj. W przypadku Uibuttonu łączysz go z selektorem, który jest wywoływany, gdy użytkownik wchodzi w interakcję z przyciskiem, zazwyczaj zdarzenie TouchUpInside. The addTarget method, and valid selector signatures (apple.com) Spośród nich, chcesz użyć metody w formacie @IBAction func doSomething(sender: UIButton)
lub @IBAction func doSomething(sender: UIButton, forEvent event: UIEvent)
, aby odwołanie do przycisku, który wywołał zdarzenie, zostało przekazane do selektora.
W kodzie ViewController, musisz odniesień do swoich UIButtons (ewentualnie w serii ujęć lub tworzone ręcznie). Załóżmy, że masz
@IBOutlet weak var frenchButton: UIButton!
@IBOutlet weak var spanishButton: UIButton!
@IBOutlet weak var englishButton: UIButton!
Można by połączyć wszystkie z nich do tej samej metody, i rozgałęzienie logiki opartej na tym, który był nadawcą. np .:
@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
}
}
Uwaga: Oświadczenia Sprawa w Swift musi być wyczerpująca, więc trzeba to domyślny sprawy, mimo że nigdy nie powinno się nazywać.
nie lubię, aby ustawić znacznik, jeśli możemy go rozwiązać bez tagu
@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 {
}
}
Tak, jego dobry pomysł; D –
Każdy pomysł jak je skonfigurować, który obsługuje ibactions? – SwiftyJD
nadawca ma wiele właściwości: tytuł, znacznik i inne. możesz również utworzyć niestandardową klasę przycisków z właściwością identyfikacji. –