2010-02-18 15 views
23

ho i seguenti frammenti di codice:Tenere iPhone UIButton evidenziato

@interface Foo: UIViewController { 
    ... 
    UIButton *myButton; 
    ... 
} 

@implementation Foo

- (void) viewDidLoad { 
    ... 
    myButton.highlighted = YES; 
    ... 
} 

Quando eseguo l'applicazione, il pulsante è evidenziato in blu (comportamento predefinito). Funziona come mi aspettavo.

Ma dopo aver premuto il pulsante una volta, il pulsante non viene più evidenziato.

Quindi, ho creato un IBActionhighlightButton per gestire l'evento Touch Up Inside dove ho chiamato esplicitamente myButton.highlighted = Yes;. Sfortunatamente, l'evidenziazione del pulsante continua a non rimanere.

Come posso mantenerlo evidenziato in blu anche dopo essere stato premuto?

+1

Sarebbe più semplice cambiare il colore del pulsante? :) – willcodejavaforfood

+0

Vedere la mia domanda [qui] (http://stackoverflow.com/questions/1934861/uibutton-border-and-background-image). –

+0

Grazie per il suggerimento. Non sto usando alcuna immagine. Uso semplicemente il testo chiamando "[myButton setTitle: @" Foo "forState: UIControlStateNormal]". – pion

risposta

45

La soluzione è quella di fare [button setHighlighted:YES] nella prossima runloop:

- (void)highlightButton:(UIButton *)b { 
    [b setHighlighted:YES]; 
} 

- (IBAction)onTouchup:(UIButton *)sender { 
    [self performSelector:@selector(highlightButton:) withObject:sender afterDelay:0.0]; 
} 
+0

Funziona perfettamente. – spa

+0

Grazie, Werner. Potresti spiegare perché dobbiamo impostarlo nel prossimo runloop? Il pulsante non viene ridisegnato quando chiamiamo questo particolare metodo? –

+2

Il problema è che il framework iOS chiama onTouchup (il gestore di eventi) e in seguito evidenzia il pulsante (setHighlighted: NO). Quindi chiamare setHighlighted nel gestore eventi non ha alcun effetto. –

7

Un modo alternativo per eseguire questo è con l'invio di un blocco alla coda di operazione principale:

-(void)onTouchup:(UIButton*) button 
{ 
    [NSOperationQueue.mainQueue addOperationWithBlock:^{ button.highlighted = YES; }]; 
} 
+3

Oh wow. Come mai avrei scoperto questo senza StackOverflow? –

13

Il codice più semplice è Qui.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [button setHighlighted:YES]; 
}); 
+0

l'opzione migliore. Non fa lampeggiare brevemente il pulsante allo stato normale dopo che l'utente ha sollevato il dito. –

+0

Senza contare che in questo modo è possibile eseguire questa operazione con più pulsanti in una vista e mantenerla MOLTO ordinata. – CaptJak

+0

Mi chiedo solo ... il blocco "gdc" qui viene rilasciato dalla memoria dopo che è stato fatto bene? – lppier

Problemi correlati