Używam addTarget: action: forControlEvents w ten sposób:
[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];
i chciałbym przekazać parametry do mojego selektora „switchToNewsDetails”. Jedyne, co mi się udało, to przekazać nadawcę (id) pisząc:
action:@selector(switchToNewsDetails:)
Ale próbuję przekazać zmienne, takie jak wartości całkowite. Pisanie w ten sposób nie działa:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];
Pisanie w ten sposób też nie działa:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];
Każda pomoc będzie mile widziana :)
ios
objective-c
iphone
cocoa-touch
uicontrolevents
Pierre Espenan
źródło
źródło
Odpowiedzi:
Nie przekazujesz tutaj parametrów do
switchToNewsDetails:
metody. Po prostu tworzysz selektor, aby przycisk mógł go wywołać, gdy nastąpi określona akcja (w twoim przypadku retusz). Kontrolki mogą używać 3 typów selektorów do reagowania na akcje, wszystkie mają predefiniowane znaczenie swoich parametrów:bez parametrów
z 1 parametrem wskazującym kontrolkę, która wysyła wiadomość
Z 2 parametrami wskazującymi kontrolkę, która wysyła wiadomość i zdarzenie, które wywołało wiadomość:
Nie jest jasne, co dokładnie próbujesz zrobić, ale biorąc pod uwagę, że chcesz przypisać określony indeks szczegółów do każdego przycisku, możesz wykonać następujące czynności:
w
switchToNewsDetails:
metodzie możesz uzyskać ten indeks i otworzyć odpowiednie szczegóły:źródło
[button.layer setValue:yourObject forKey:@"anyKey"];
a następnie w metodzie po prostu sprawdź(objectClass *)[button.layer valueForKey:@"anyKey"];
To jest jak bardziej darmowa wersja.tag
Aby przekazać własne parametry wraz z przyciskiem, wystarczy kliknąć przycisk SUBCLASS UIB .
(ASR jest włączony, więc w kodzie nie ma żadnych wydań).
To jest myButton.h
To jest myButton.m
Stosowanie:
Funkcja pobierania:
Jeśli chcesz, abym sprecyzował jakąkolwiek część powyższego kodu - możesz zapytać o to w komentarzach.
źródło
tag
właściwości w widokach Androida . Mogą przechowywać dowolny przedmiot. Możesz także przechowywać obiekty według klucza, jak w słowniku / mapie.Target-Action umożliwia trzy różne formy selektora działań:
źródło
Potrzebujesz czegoś więcej niż tylko (int) via .tag? Użyj KVC!
Możesz przekazać dowolne dane za pośrednictwem samego obiektu przycisku (uzyskując dostęp do polecenia CALayers keyValue dict).
Ustaw swój cel w ten sposób (za pomocą „:”)
Dodaj swoje dane do samego przycisku (dobrze
.layer
do przycisku) w następujący sposób:Następnie po dotknięciu przycisku możesz to sprawdzić w ten sposób:
źródło
Rozwiązanie stworzyłem częściowo na podstawie powyższych informacji. Po prostu ustawiłem titlelabel.text na ciąg, który chcę przekazać, i ustawiłem titlelabel.hidden = TAK
Lubię to :
W ten sposób nie ma potrzeby dziedziczenia ani kategorii i nie ma wycieku pamięci
źródło
Tworzyłem kilka przycisków dla każdego numeru telefonu w tablicy, więc każdy przycisk wymagał innego numeru telefonu do połączenia. Użyłem funkcji setTag, ponieważ tworzyłem kilka przycisków w pętli for:
Następnie w mojej metodzie call: użyłem tej samej pętli for i instrukcji if, aby wybrać prawidłowy numer telefonu:
źródło
- (void)call:(UIButton *)sender { NSString *phoneNumber = _phoneNumbers[i]; NSString *callString = [NSString stringWithFormat:@"telprompt://%@", phoneNumber]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]]; }
Ponieważ istnieje wiele sposobów rozwiązania, z wyjątkiem funkcji kategorii.
Na przykład (ex):
w Twoim widoku Controller.m
Procedura obsługi zdarzeń:
źródło
Możesz zamienić akcję docelową na zamknięcie (blok w Objective-C), dodając otokę zamknięcia pomocnika (ClosureSleeve) i dodając ją jako skojarzony obiekt do kontrolki, aby została zachowana. W ten sposób możesz przekazać dowolne parametry.
Szybki 3
Stosowanie:
źródło
self.switchToNewsDetails(parameter: i)
) odpalanie 2 razy, dlaczego mi pomóżbutton.addAction()
dwukrotne wywołanie . Dodaj punkt przerwania do,button.addAction
a także w pierwszym wierszu wewnątrz zamknięcia i spróbuj samodzielnie go debugować.Istnieje inny sposób, w jaki możesz uzyskać indexPath komórki, w której został naciśnięty przycisk:
używając zwykłego selektora akcji, takiego jak:
a następnie w yourFunction:
ponieważ otrzymujesz indexPath, staje się to znacznie prostsze.
źródło
Zobacz mój komentarz powyżej i uważam, że musisz użyć NSInvocation, gdy jest więcej niż jeden parametr
więcej informacji na temat NSInvocation tutaj
http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
źródło
To rozwiązało mój problem, ale uległo awarii, chyba że się zmieniłem
do
źródło
Podklasowałem UIButton w CustomButton i dodaję właściwość, w której przechowuję moje dane. Wywołuję więc metodę: (CustomButton *) nadawca, aw metodzie tylko odczytam moje dane sender.myproperty.
Przykład CustomButton:
Działanie metody:
Przypisz działanie
źródło
Jeśli chcesz tylko zmienić tekst dla leftBarButtonItem wyświetlanego przez kontroler nawigacji wraz z nowym widokiem, możesz zmienić tytuł bieżącego widoku tuż przed wywołaniem metody pushViewController na żądany tekst i przywrócić go w wywołaniu zwrotnym viewHasDisappered dla przyszłych pokazów aktualny widok.
Takie podejście zachowuje funkcjonalność (popViewController) i wygląd wyświetlanej strzałki w stanie nienaruszonym.
Działa dla nas przynajmniej z iOS 12, zbudowanym z Xcode 10.1 ...
źródło