Próbuję przekazać dodatkowy parametr do akcji buttonClicked, ale nie mogę ustalić, jaka powinna być składnia w języku Swift.
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Dowolna metoda buttonClicked:
func buttonClicked(sender:UIButton)
{
println("hello")
}
Czy ktoś ma jakieś pomysły?
Dzięki za pomoc.
WARNING TO INTERNET: please check out my answer at the bottom
Odpowiedzi:
Nie możesz przekazać parametrów niestandardowych w
addTarget:
.Jedną alternatywą jest ustawienietag
właściwości przycisku i wykonanie pracy w oparciu o tag.Lub dla Swift 2.2 i nowszych:
Teraz wykonaj logikę opartą na
tag
własnościźródło
Int
. Nic więcej.Jeśli chcesz wysłać dodatkowe parametry do metody buttonClicked, na przykład indexPath lub urlString, możesz podklasować UIButton:
Upewnij się, że zmienisz klasę przycisku w inspektorze tożsamości na podklasęUIButton. Możesz uzyskać dostęp do parametrów wewnątrz metody buttonClicked za pomocą
sender.indexPath
lubsender.urlString
.Uwaga: Jeśli twój przycisk znajduje się wewnątrz komórki, możesz ustawić wartość tych dodatkowych parametrów w metodzie cellForRowAtIndexPath (gdzie przycisk jest tworzony).
źródło
Doceniam wszystkich, którzy mówią używaj tagów, ale tak naprawdę musisz rozszerzyć klasę UIButton i po prostu dodać tam obiekt.
Tagi są beznadziejnym sposobem obejścia tego. Rozszerz UIButton w ten sposób (w Swift 4)
wtedy może to być połączenie (UWAGA dwukropek „:” w
Selector(("webButtonTouched:"))
)w końcu złap to wszystko tutaj
Robisz to raz i używasz go w całym projekcie (możesz nawet sprawić, by klasa podrzędna miała ogólny „obiekt” i wstawić cokolwiek chcesz do przycisku!). Lub skorzystaj z powyższego przykładu, aby umieścić niewyczerpaną liczbę parametrów klucza / ciągu znaków w przycisku. Naprawdę przydatne do uwzględniania takich rzeczy, jak adresy URL, metodologia potwierdzania wiadomości itp.
SO
Nawiasem mówiąc, ważne jest, aby społeczność zdała sobie z tego sprawę, że przez alarmującą liczbę programistów, którzy nie rozumieją / nie zostali nauczeni / przegapili sens pojęcieobject extensions
źródło
W przypadku Swift 3.0 możesz użyć następujących
źródło
Swift 4.2
Wynik:
W pliku
UIButton+Events.swift
stworzyłem metodę rozszerzenia,UIButton
która wiąże aUIControl.Event
z programem obsługi zakończenia o nazwieEventHandler
:Powodem, dla którego użyłem niestandardowej klasy do powiązania zdarzenia, jest możliwość usunięcia odwołania później, gdy przycisk jest deintializowany. Zapobiegnie to ewentualnemu wyciekowi pamięci. Nie było to możliwe w ramach
UIButton
jego rozszerzenia, ponieważ nie mogę zaimplementować właściwości anideinit
metody.źródło
Jeśli masz pętlę przycisków jak ja, możesz spróbować czegoś takiego
źródło
Kod Swift 4.0 (znowu zaczynamy)
Wywołana akcja powinna być oznaczona w ten sposób, ponieważ jest to składnia funkcji szybkiej do eksportowania funkcji do obiektywnego języka c.
utwórz działający przycisk:
źródło
Kod Swift 5.0
Używam theButton.tag, ale jeśli mam dużo opcji, jest to bardzo długa obudowa przełącznika.
.
źródło
Dla Swift 2.X i nowszych
źródło
Kod Swift 3.0
Możesz wysłać wartość w „informacje o użytkowniku” i użyć jej jako parametru w funkcji.
źródło
To jest bardziej ważny komentarz. Udostępnianie referencji sytanx, które jest dopuszczalne po wyjęciu z pudełka. W przypadku rozwiązań hakerskich spójrz na inne odpowiedzi.
Zgodnie z dokumentacją Apple, definicje metod działania muszą być jedną z tych trzech. Wszystko inne jest niedopuszczalne.
źródło