Programmatisch Feuerknopf-Klickereignis?


126

Gibt es eine Möglichkeit, ein Schaltflächenklickereignis programmgesteuert auszulösen? Ich habe dort eine Schaltfläche in einer UIView platziert, und in einem bestimmten Szenario möchte ich auf die Schaltfläche per Code klicken, nicht manuell als Benutzer. Ist es in der iOS-Entwicklung möglich? Bitte geben Sie Ihre Vorschläge und leiten Sie mich, wie das geht.

Vielen Dank.

Antworten:


313

Ähnlich wie Kens Antwort, aber flexibler, da die tatsächlichen Aktionen der Schaltflächen verfolgt werden, wenn Sie sie ändern oder mehr als eine hinzufügen.

[button sendActionsForControlEvents:UIControlEventTouchUpInside];

8
Markiert dies die Schaltfläche, wenn button.showsTouchWhenHighlighted = YESdies mit einer tatsächlichen Berührung geschehen würde?
Chown

2
Diese Antwort ist großartig, da sie leicht in andere Steuerelemente wie UISwitch (UIControlEventValueChanged) übersetzt werden kann und in meinem Fall viel besser ist, als den Ziel- / Aktionscode direkt aufzurufen. B / c Ich möchte, dass der Schalter wechselt! Vielen Dank.
John Erck

Nein, die Schaltfläche wird nicht hervorgehoben, wenn button.showsTouchWhenHighlighted = YES. ; (
Richie Hyatt

7
Wenn Sie das Highlight benötigen, können Sie dies tun. [button setHighlighted: YES]; [button sendActionsForControlEvents: UIControlEventTouchUpInside]; [button setHighlighted: NO]; und es funktioniert super. -rrh
Richie Hyatt

Hallo @zaky, wenn ich nur Animation ohne Sendeaktion möchte, wie kann ich das machen?
Benhi

13

Ich hatte das gleiche Problem wie oben. Ich hätte einen Kommentar gepostet, aber mein Ruf ist nicht hoch genug. Also werde ich stattdessen die vollständige Antwort posten:

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

Dadurch wird die Taste programmgesteuert gedrückt und für eine scheinbar normale Zeitspanne hervorgehoben. Richies Vorschlag funktionierte nicht, da die Schaltfläche nur (wenn überhaupt) für eine unmerkliche Zeitspanne hervorgehoben wurde.


Es wurde nicht hervorgehoben. Das Zeichnen erfolgt erst, nachdem die Ausführung des aktuellen Codeabschnitts abgeschlossen ist. Dies ist eine schöne Lösung.
Mattsven

6

Warum nicht einfach den Code ausführen, der ausgeführt wird, wenn der Benutzer die Taste drückt?

-(void)myMethod
{
   // do stuff
}

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

-(void)clickMyButton
{
    [self myMethod];
    // OR
    [self myButtonClick:nil];
}

Nein, meine Anforderung besteht nicht darin, die Methode aufzurufen, wie ein Schaltflächenklickereignis programmgesteuert ausgelöst wird, und nicht, wenn der Benutzer manuell darauf klickt. Ich habe einen UIButton programmgesteuert in einer UIView erstellt. Ich möchte das Ereignis zum Klicken auf Schaltflächen nach einem bestimmten Zeitintervall automatisch über das Programm selbst und nicht vom Benutzer auslösen.
Getsy

Dann ist es nicht möglich, ohne die Berührung zu synthetisieren. Siehe cocoawithlove.com/2008/10/… . Sie können Ihre App jedoch nicht mit dieser Methode an den App Store senden, da eine private API verwendet wird. Es wird normalerweise zum Debuggen verwendet.
Evan Mulawski

Sie erklären nicht, warum Sie eine Berührung simulieren müssen, anstatt nur die Methode aufzurufen, aber das ist bei weitem der einfachste Weg. Ihre Timer-Aktion kann jede gewünschte Methode aufrufen, und die aufgerufene Methode kann in der Benutzeroberfläche durch Ändern des Schaltflächenstatus (ausgewählt, hervorgehoben usw.) eine Rückmeldung darüber geben, dass die Schaltfläche gedrückt wird. Wenn das nicht funktioniert, soll es so sein.
XJones

1

Wenn Sie über einen UIButton sprechen, können Sie einfach dieselbe Methode aufrufen, die der UIButton beim Tippen aufruft. Beispielsweise:

[self myButtonsTargetMethod];

Nein, meine Anforderung besteht nicht darin, die Methode aufzurufen, wie ein Schaltflächenklickereignis programmgesteuert ausgelöst wird, und nicht, wenn der Benutzer manuell darauf klickt. Ich habe einen UIButton programmgesteuert in einem UIView erstellt. Ich möchte das Ereignis zum Klicken auf Schaltflächen nach einem bestimmten Zeitintervall automatisch über das Programm selbst und nicht vom Benutzer auslösen.
Getsy

1

Ja,

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

Das Problem hierbei ist jedoch, dass Sie dieses Ereignis nicht sehen können, da es zu schnell ist. Sie können also den obigen Code mit NSTimer ausprobieren.

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

MeFirst ist die Methode, die ich erstellt habe.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.