Programowe uruchomienie zdarzenia kliknięcia przycisku?

126

Czy istnieje sposób na programowe wywołanie zdarzenia kliknięcia przycisku? Mam przycisk umieszczony tam w UIView iw określonym scenariuszu chcę kliknąć przycisk za pomocą kodu, a nie ręcznie jako użytkownik. Czy jest to możliwe w rozwoju iOS? Podaj swoje sugestie i pokaż mi, jak to zrobić.

Dzięki.

Getsy
źródło

Odpowiedzi:

313

Coś jak odpowiedź Kena, ale bardziej elastyczne, ponieważ śledzi rzeczywiste działania przycisków, jeśli je zmienisz lub dodasz więcej niż jeden.

[button sendActionsForControlEvents:UIControlEventTouchUpInside];
Zaky niemiecki
źródło
8
Czy to podświetla przycisk, jeśli button.showsTouchWhenHighlighted = YESchciałoby się to z faktycznym dotknięciem?
chown,
2
Ta odpowiedź jest świetna, b / c można ją łatwo przetłumaczyć na inne kontrolki, takie jak UISwitch (UIControlEventValueChanged), aw moim przypadku jest znacznie lepsza niż bezpośrednie wywoływanie kodu celu / akcji b / c Chcę, aby przełącznik się przełączył! Dzięki.
John Erck
Nie, przycisk nie jest podświetlany, jeśli button.showsTouchWhenHighlighted = YES. ; (
Richie Hyatt
7
jeśli potrzebujesz wyróżnienia, możesz to zrobić. [przycisk setHighlighted: YES]; [przycisk sendActionsForControlEvents: UIControlEventTouchUpInside]; [przycisk setHighlighted: NO]; i działa świetnie. -rrh
Richie Hyatt
Witaj @zaky, jeśli chcę tylko animacji, bez akcji wysyłania, jak mogę to zrobić?
benhi
13

Miałem ten sam problem co powyżej. Opublikowałbym komentarz, ale moja reputacja nie jest wystarczająco wysoka. Więc zamiast tego opublikuję pełną odpowiedź:

[btn setHighlighted:YES];
[btn sendActionsForControlEvents:UIControlEventTouchUpInside];
[btn performSelector:@selector(setHighlighted:) withObject:NO afterDelay:0.25];

Spowoduje to programowe naciśnięcie przycisku i podświetlenie go przez pozornie normalny czas. Sugestia Richiego nie zadziałała, ponieważ przycisk był podświetlony (jeśli w ogóle) przez niedostrzegalny czas.

Chad Hine
źródło
Nie został podświetlony, rysowanie następuje dopiero po zakończeniu wykonywania bieżącego fragmentu kodu. To niezła poprawka.
mattsven
6

Dlaczego po prostu nie wykonać kodu, który jest wykonywany, gdy użytkownik naciśnie przycisk?

-(void)myMethod
{
   // do stuff
}

-(IBAction)myButtonClick:(id)sender
{
    [self myMethod];
}

-(void)clickMyButton
{
    [self myMethod];
    // OR
    [self myButtonClick:nil];
}
Evan Mulawski
źródło
Nie, moim wymaganiem nie jest wywołanie metody, programowe wywoływanie zdarzenia kliknięcia przycisku, a nie ręczne kliknięcie przez użytkownika. Utworzyłem UIButton programowo w UIView, chcę uruchamiać zdarzenie kliknięcia przycisku automatycznie po określonym przedziale czasu przez sam program, a nie przez użytkownika.
Getsy
Wtedy nie jest to możliwe bez syntezy dotyku. Zobacz cocoawithlove.com/2008/10/… . Nie możesz jednak przesłać aplikacji do App Store za pomocą tej metody, ponieważ używa ona prywatnego interfejsu API. Zwykle jest używany do celów debugowania.
Evan Mulawski
Nie wyjaśniasz, dlaczego musisz symulować dotyk, a nie tylko wywoływać metodę, ale jest to zdecydowanie najłatwiejszy sposób. Twoja akcja timera może wywołać dowolną metodę, a metoda, którą wywołuje, może przekazać informację zwrotną w interfejsie użytkownika, że ​​przycisk jest naciśnięty, zmieniając stan przycisku (wybrany, podświetlony itp.). Jeśli to nie zadziała, niech tak będzie.
XJones
1

Jeśli mówisz o UIButton, możesz po prostu wywołać tę samą metodę, którą wywołuje UIButton, gdy jest dotknięty. Na przykład:

[self myButtonsTargetMethod];
Ken Pespisa
źródło
Nie, moim wymaganiem nie jest wywołanie metody, programowe wywoływanie zdarzenia kliknięcia przycisku, a nie ręczne kliknięcie przez użytkownika. Utworzyłem UIButton programowo w UIView, chcę uruchamiać zdarzenie kliknięcia przycisku automatycznie po określonym przedziale czasu przez sam program, a nie przez użytkownika.
Getsy
1

Tak,

[_button setHighlighted:YES];
[_button sendActionsForControlEvents:UIControlEventTouchUpInside];
[_button setHighlighted:NO];

Ale problem polega na tym, że nie będziesz w stanie zobaczyć tych wydarzeń, ponieważ są one zbyt szybkie. więc co możesz zrobić, to wypróbować powyższy kod za pomocą NSTimer.

NSTimer *quick = [NSTimer scheduledTimerWithTimeInterval:2.5 target:self selector:@selector(MeFirst:) userInfo:nil repeats:NO];

MeFirst to metoda, którą stworzyłem.

Bharat jain
źródło