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.