Evento clic pulsante di attivazione programmata?


126

Esiste un modo per generare a livello di codice un evento clic sul pulsante? Ho un pulsante posizionato in una UIView e in uno scenario particolare voglio fare clic sul pulsante tramite codice, non manualmente come utente. È possibile nello sviluppo di iOS? Fornisci i tuoi suggerimenti e guidami su come farlo.

Grazie.

Risposte:


313

Un po 'come la risposta di Ken, ma più flessibile in quanto terrà traccia dei pulsanti delle azioni effettive se le cambi o ne aggiungi più di una.

[button sendActionsForControlEvents:UIControlEventTouchUpInside];

8
Questo evidenzia il pulsante se button.showsTouchWhenHighlighted = YEScome farebbe con un tocco reale?
abito

2
Questa risposta è ottima in b / c, può essere facilmente tradotta in altri controlli come UISwitch (UIControlEventValueChanged) e nel mio caso è molto meglio che chiamare direttamente il codice target / azione b / c Voglio che l'interruttore cambi! Grazie.
John Erck,

No, non evidenzia il pulsante se button.showsTouchWhenHighlighted = YES. ; (
Richie Hyatt

7
se hai bisogno del momento saliente puoi farlo. [pulsante impostato Evidenziato: SÌ]; [pulsante sendActionsForControlEvents: UIControlEventTouchUpInside]; [pulsante impostato Evidenziato: NO]; e funziona benissimo. -rrh
Richie Hyatt

Ciao @zaky, se voglio solo l'animazione, senza inviare azioni, come posso fare?
benhi,

13

Ho avuto lo stesso problema di cui sopra. Avrei pubblicato un commento, ma la mia reputazione non è abbastanza alta. Quindi, posterò invece la risposta completa:

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

Ciò premerà programmaticamente il pulsante e lo evidenzierà per un periodo di tempo apparentemente normale. Il suggerimento di Richie non ha funzionato poiché il pulsante è stato evidenziato (se non del tutto) per un periodo di tempo impercettibile.


Non è stato evidenziato, il disegno si verifica solo dopo l'esecuzione dell'attuale blocco di codice. Questa è una bella soluzione.
mattsven,

6

Perché non eseguire semplicemente il codice che viene eseguito quando l'utente preme il pulsante?

-(void)myMethod
{
   // do stuff
}

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

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

No, il mio requisito non è chiamare il metodo, come attivare l'evento clic sul pulsante a livello di codice, non quando l'utente lo fa clic manualmente. Ho creato un UIButton a livello di codice in una UIView, voglio lanciare automaticamente l'evento click sul pulsante dopo un certo intervallo di tempo tramite il programma stesso, non dall'utente.
Getsy,

Quindi non è possibile senza sintetizzare il tocco. Vedi cocoawithlove.com/2008/10/… . Tuttavia, non puoi inviare la tua app all'App Store utilizzando questo metodo, poiché utilizza un'API privata. Viene normalmente utilizzato per scopi di debug.
Evan Mulawski l'

Non spieghi perché devi simulare un tocco rispetto al solo chiamare il metodo, ma questo è di gran lunga il modo più semplice di procedere. L'azione del timer può chiamare qualsiasi metodo desiderato e il metodo che chiama può fornire feedback nell'interfaccia utente relativa alla pressione del pulsante modificando lo stato del pulsante (selezionato, evidenziato, ecc.). Se non funziona, così sia.
XJones,

1

Se stai parlando di un UIButton, puoi semplicemente chiamare lo stesso metodo che l'UIButton sta chiamando quando viene toccato. Per esempio:

[self myButtonsTargetMethod];

No, il mio requisito non è chiamare il metodo, come attivare l'evento clic sul pulsante a livello di codice, non quando l'utente lo fa clic manualmente. Ho creato un UIButton a livello di codice in una UIView, voglio lanciare automaticamente l'evento click sul pulsante dopo un certo intervallo di tempo tramite il programma stesso, non dall'utente.
Getsy,

1

Sì,

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

Ma il problema qui è che non sarai in grado di vedere quegli eventi perché è troppo veloce. quindi quello che puoi fare è provare il codice sopra con NSTimer.

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

MeFirst è il metodo che ho creato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.