2010-06-16 13 views
10

In IB posso impostare l'identificatore di un'UIBarButtonItem di 'giocare', che aggiunge l'immagine di un pulsante di riproduzione (triangolo verso destra).Cambia (non init) un identificatore UIBarButtonItem programmaticamente?

C'è un modo per cambiare questa immagine programatically? Voglio cambiarlo in 'pausa' quando viene premuto il pulsante di riproduzione.

So che è possibile inizializzare un UIBarButtonItem con un identificatore ma ho ancora trovare un modo per cambiarlo dopo che è stato inizializzato. È possibile?

L'unica cosa che mi viene in mente è quello di rimuovere il vecchio pulsante e inizializzare una nuova al suo posto, ma questo non sembra efficiente.

Qualche idea?

risposta

14

Ok ho cercato su Google questa domanda e ho eseguito sample code from Apple dove fanno esattamente la stessa cosa (attiva/disattiva la grafica del pulsante di riproduzione su un pulsante della barra degli strumenti). Ma invece di usare gli identificatori di riproduzione e pausa incorporati di UIBarButtonItem, usano un custom UIButton e attivano le immagini personalizzate.

Quindi, se Apple passa attraverso la briga di creare e commutando immagini personalizzate su un UIButton invece del costruito in gioco e mettere in pausa UIBarButtonItem pulsanti allora penso che sia abbastanza sicuro di dire che non c'è modo di cambiare programatically l'identificatore di una UIBarButtonItem.

Questo è quello che hanno (Apple) fanno per alternare le immagini quando si preme il pulsante:

// Call this when the button you want to toggle is pressed: 
[playButton setImage:((p.playing == YES) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal]; 

Sostituire p.playing con qualunque BOOL si desidera mantenere lo stato del pulsante. playButton è la personalizzata UIButton nella barra degli strumenti. pauseBtnBG e playBtnBG sono le immagini da alternare.

13

Questo sembra funzionare abbastanza bene:

UIBarButtonItem *oldButton = [myToolBar.items objectAtIndex:1]; 
[myToolBar setItems:[NSArray arrayWithObjects:[myToolBar objectAtIndex:0], [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop target:self action:@selector(tapStopRefreshButton:)],nil] animated:NO]; 
[oldButton release]; 

In questo esempio ho avuto una barra degli strumenti per un'UIWebView e quando qualcuno fa clic su Ricarica ho voluto cambiare Stop. La barra degli strumenti aveva solo uno spazio flessibile e l'unico pulsante su di esso - per allineare a destra il pulsante - così ho preso un riferimento al vecchio pulsante, ne ho creato uno nuovo con lo stesso selettore del vecchio, ripristina i pulsanti sulla barra delle schede e quindi rilasciato il pulsante originale.

non la più bella, ma è possibile utilizzare tutti i pulsanti standard, senza dover sostituire la classe tasto (es).

+0

Apple fa questo nell'esempio StitchedStreamPlayer: http://developer.apple.com/library/ios/#samplecode/StitchedStreamPlayer/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010092 – pablasso

+0

Mentre tecnicamente non e ' cambiando 'il 'UIBarButtonSystemItem' come l'OP è dopo, questa risposta consente la * sostituzione * di un elemento del sistema con un altro. –

+0

Sebbene, in questo esempio, il nuovo 'UIBarButtonItem' debba essere inizializzato prima di essere inserito nell'array, in modo che possa essere rilasciato correttamente. –

0

Cosa circa 2 barre degli strumenti impilati? Quindi puoi avere alcuni pulsanti di sistema nella parte superiore e altri nella parte inferiore. Se viene premuto il pulsante di riproduzione, è sufficiente nascondere la barra degli strumenti superiore.

+0

Sta cercando di cambiare l'immagine o di scambiare il pulsante, non avere una barra degli strumenti scompare. – JoshDM

+0

@JoshDM Tuttavia se la barra degli strumenti scompare, il pulsante mostrato all'utente cambierà. Inoltre, in questi casi normalmente non ne hai uno, ma un insieme di pulsanti che devi modificare, quindi trovo più semplice avere due barre degli strumenti diverse con gli UIBarButtonItem standard invece di creare e attivare gli UIButtons personalizzati. Inoltre è più facile "nascondere" una vista. Ma hai ragione non è la risposta alla domanda, è una risposta al problema del richiedente. – FranMowinckel

Problemi correlati