2011-08-29 14 views
14

Ho un tipico requisito in cui ho bisogno di mantenere un pulsante nello stato evidenziato dopo averlo premuto. Devo eseguire un'attività che dovrebbe funzionare solo quando un pulsante è in uno stato evidenziato. In realtà sto impostando uno stato del pulsante su evidenziato in modo programmatico.Come impostare lo stato UIButton da evidenziare dopo averlo premuto

[sender setHighlighted:YES];

E una volta che il pulsante è in stato evidenziato ho bisogno di eseguire un'altra azione.

- (IBAction)changeState: (UIButton*)sender 
{ 
    if (sender.highlighted == YES) 
    { 
     [self performSomeAtion:sender]; 
    } 
} 

Ma, con mio grande orrore, ogni volta che si preme un tasto qualsiasi, la condizione di cui sopra sta diventando vera e l'azione è in corso di esecuzione più volte. C'è un modo in cui posso mantenere lo stato di UIButton da evidenziare dopo averlo premuto?

EDIT - In realtà ho bisogno di effettuare 3 azioni diverse per 3 diversi stati del pulsante. Sto già facendo uso dello stato selezionato e dello stato normale. Ora, ho bisogno di usare lo stato evidenziato.

+0

È possibile impostare una variabile BOOL che aggiornerà su TRUE una volta che l'azione è stata eseguita. –

+0

ma ho bisogno di impostare il pulsante sullo stato evidenziato e deve rimanere nello stato evidenziato a meno che non lo cambi di nuovo .. –

+0

Solo per iOS 7, dovresti prendere in considerazione l'impostazione renderMode su UIImageRenderingModeAlwaysTemplate e quindi usare il colore Tinta per rappresentare vari stati . vedi http://stackoverflow.com/questions/19802982/apply-tintcolor-to-uiimage –

risposta

4

Lo stato evidenziato viene utilizzato per evidenziare il pulsante mentre viene toccato. Un evento di tocco nel pulsante lo evidenzia. Dovresti invece utilizzare lo stato "selezionato".

Se ciò che si desidera eseguire è eseguire un'azione dopo aver premuto il pulsante, non collegare il metodo all'evento di modifica stato, collegare il metodo all'evento TouchUpInside.

+0

+1 per una bella spiegazione. In realtà ho bisogno di eseguire 3 azioni diverse per 3 diversi stati del pulsante. Questo è dove mi sono bloccato .. Qualsiasi aiuto sarebbe molto apprezzato (Si prega di verificare la mia domanda aggiornata) –

1

Utilizzare [sender setSelected: YES];, penso che ti sarà utile.

+0

come menzionato nella mia domanda, ho bisogno di utilizzare lo stato evidenziato del pulsante non lo stato selezionato. –

+0

UIButton * btn_tmp = sender; if (! (Btn_temp.selected)) {// vero quando il pulsante non è selezionato mai } – Narayana

15
[sender setSelected:YES]; 

oppure è possibile simulare questo effetto con l'immagine di due per il vostro UIButton (notselectedimage.png e selectedimage.png), quindi tenere traccia dello stato pulsante con una variabile BOOL come BOOL buttonCurrentStatus;. Poi, nel file h:

BOOL buttonCurrentStatus; 

e nel file di .m

// connect this method with Touchupinside function 
- (IBAction)changeState:(UIButton*)sender 
{ 
    /* if we have multiple buttons, then we can 
     differentiate them by tag value of button.*/ 
    // But note that you have to set the tag value before use this method. 

    if([sender tag] == yourButtontag){ 

    if (buttonCurrentStatus == NO) 
    { 
     buttonCurrentStatus = YES; 
     [butt setImage: [UIImage imageNamed:@"selectedImage.png"] forState:UIControlStateNormal]; 
     //[self performSomeAction:sender]; 
    } 
    else 
    { 
     buttonCurrentStatus = NO; 
     [butt setImage:[UIImage imageNamed:@"notSelectedImage.png"] forState:UIControlStateNormal]; 
     //[self performSomeAction:sender]; 
    } 
    } 
} 
+0

Grazie per la risposta vijay .. La risposta funziona bene se ho un solo pulsante. Ma il mio caso è un po 'più complicato. Ho più pulsanti che dovrebbero eseguire 3 azioni per 3 stati. Qualche suggerimento ??? +1 anche per la risposta ... –

+0

UISegmentControl u know.use that.if vuoi più aiuto allora rispondi.http: //www.mobisoftinfotech.com/blog/iphone/iphone-segmented-controluisegmentedcontrol-tutorial/ –

+2

Se tu avere più pulsanti, tutto quello che devi fare è prendere la risposta di Vijay e modificarla aggiungendo 'tag's ai tuoi pulsanti e poi facendo ... ' UIButton * button = (UIButton *) mittente; ' ' if (pulsante. tag == 1) ... ' –

2

Il modo in cui si descrive, si sarebbe meglio sottoclasse UIView per creare il proprio pulsante a tre stati.

In realtà, si dovrebbe anche implementare il proprio pulsante multistateView e gestire lo stato in cui si trova internamente tramite una serie di PNG per gli aspetti e una serie di stati per sapere quante volte è stato premuto.

0
UIButton *btn_tmp=sender; 
    if(!(btn_tmp.selected)) 
    { 
[btn_temp setHighlighted:YES]; 

} 
+0

ho impostato il pulsante sullo stato evidenziato. Ma quando provo a controllare lo stato del pulsante non riesco a ottenere lo stato esatto. Immagino quando premo lo stesso pulsante, lo stato viene modificato da evidenziato a qualcos'altro .. c'è un modo per trovare quel narayana ?. –

3

Ho appena trovato un modo, quindi lo condivido, nel caso in cui ...

ho mantenuto la mia UIButton e impostare un'immagine per ogni stato (così si potrebbe arrivare fino a un pulsante 4 stati). Ho impostato UserInteractionEnabled su NO -> Questo pulsante non riceverà alcun tocco. Lo scopo di questo primo pulsante è quello di mostrare uno stato

Creo un secondo UIButton personalizzato con lo stesso frame del primo. Per questo, nessuna immagine verrà impostata per lo stato (è un pulsante completamente trasparente). Lo scopo di questo pulsante è catturare l'evento tattile. Quindi ho aggiunto un obiettivo a questo pulsante sull'evento TouchUpInside. E poi quando l'evento viene attivato, cambio lo stato del primo pulsante in Disabilitato, Evidenziato, Selezionato o nessuno di questi stati (= Stato predefinito).

Tutto funziona come un fascino!

6
- (void)mybutton:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    button.selected = ![button isSelected]; // Important line 
    if (button.selected) 
    { 
     NSLog(@"Selected"); 
     NSLog(@"%i",button.tag); 
    } 
    else 
    { 
     NSLog(@"Un Selected"); 
     NSLog(@"%i",button.tag); 

    } 
} 
0

La soluzione è difficile, ma è possibile.

Il problema è che si è tentato di modificare lo stato evidenziato nel metodo di azione del pulsante, che suppongo effettui una pulizia o un controllo alla fine dell'azione e cambi lo stato evidenziato. Quando provi a eseguire il debug, ottieni l'evidenziato = 1, ma alla fine cambierà.

Strano ma il "pulsante 3 stati" è a volte utile, quando si desidera mantenere un pulsante in modalità "evidenziato" come la modalità "selezionata" per ottenere un'azione diversa a seconda dei 3 stati. L'unico problema che non è stato possibile analizzare o passare alla modalità evidenziata nel metodo di azione del pulsante, passerà immediatamente alla modalità evidenziata mentre l'utente lo spinge e lo riaccenderà alla fine.

La soluzione sta utilizzando una spedizione.

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [theButton setHighlighted:YES]; 
}); 

Questo farà il trucco e potresti utilizzare i 3 stati.

0

Secondo Apple, UIButton ha una proprietà di imageView:

Anche se questa proprietà è di sola lettura, le sue proprietà sono di lettura/scrittura. utilizzare queste proprietà per configurare l'aspetto e il comportamento di vista del pulsante

Ciò significa che è possibile impostare nel IB (nella storyboard) foto per questo pulsante e impostare l'immagine evidenziata:

  1. Apre l'ispettore Attributi.
  2. Nella sezione Pulsante, selezionare un'immagine.
  3. Nella stessa sezione, modificare la Config. Stato in Evidenziato. Nota che l'immagine che hai scelto in base all'impostazione predefinita ora è scomparsa e ora puoi impostare una nuova immagine per l'evidenziatore.
  4. A questo punto è disponibile un pulsante con 2 stati di configurazione e tutto ciò che è necessario fare durante il runtime per modificare button.highlighted = true. Inoltre, controllare UIControl in Configurazione degli attributi del controllo per altri stati.

Si può anche farlo programmaticamente come segue:

Swift (e quasi la stessa in Objective-C):

// Setting the highlighted image 
self.someButton.imageView?.highlightedImage = UIImage(named: "imageNameFromImageAssest") 
// someButton will now some the highlighted image and NOT the image set in the IB 
self.someButton.imageView?.highlighted = true 
Problemi correlati