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.

Getsy
quelle

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];
Zaky Deutsch
quelle
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.

Chad Hine
quelle
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];
}
Evan Mulawski
quelle
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];
Ken Pespisa
quelle
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.

Bharat Jain
quelle