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.

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];

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.


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];
}

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];

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.