2010-02-18 17 views
23

Mam następujące fragmenty kodu:przechowywać iPhone UIButton podświetlone

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

@implementation Foo

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

Kiedy uruchomić aplikację, przycisk jest podświetlony na niebiesko (domyślne zachowanie). Działa tak, jak się spodziewałem.

Ale po jednokrotnym naciśnięciu przycisku przycisk nie jest już podświetlony.

Następnie utworzyłem IBActionhighlightButton do obsługi zdarzenia Touch Up Inside, w którym jawnie nazywam się myButton.highlighted = Yes;. Niestety, podświetlenie przycisku nadal nie zostaje.

Jak mogę zachować podświetlenie na niebiesko, nawet po naciśnięciu?

+1

Czy łatwiej byłoby zmienić kolor przycisku? :) – willcodejavaforfood

+0

Zobacz moje pytanie [tutaj] (http://stackoverflow.com/questions/1934861/uibutton-border-and-background-image). –

+0

Dzięki za cynk. Nie używam żadnego obrazu. Po prostu używam tekstu, nazywając "[myButton setTitle: @" Foo "forState: UIControlStateNormal]". – pion

Odpowiedz

45

Rozwiązanie to zrobić [button setHighlighted:YES] w następnym runloop:

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

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

Działa idealnie. – spa

+0

Dziękuję Werner. Czy możesz wyjaśnić, dlaczego musimy ustawić go w następnym runloopie? Czy przycisk nie zostanie przerysowany, gdy nazywamy tę konkretną metodę? –

+2

Problem to wywołania strukturalne iOS w programieTouchup (program obsługi zdarzeń), a następnie unhighlights przycisku (setHighlighted: NO). Zatem wywołanie setHighlighted w module obsługi zdarzeń nie ma żadnego efektu. –

7

alternatywny sposób prowadzony jest przez wysyłanie blok główny kolejki operację:

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

Och, wow. Jak mogłem to odkryć bez StackOverflow? –

13

Najprostszym kodu jest tutaj.

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

najlepsza opcja. Nie powoduje, że przycisk miga krótko do normalnego stanu po podniesieniu palca przez użytkownika. –

+0

Nie wspominając, że w ten sposób można to zrobić za pomocą wielu przycisków w widoku i zachować go bardzo dobrze. – CaptJak

+0

Zastanawiam się ... blok "gdc" tutaj jest zwolniony z pamięci po wykonaniu tego poprawnie? – lppier