è possibile aggiornare il titolo / testo di UIButton a livello di programmazione?


96

Ho un UIButton, che quando premuto, fa apparire una nuova vista in cui l'utente può modificare alcune impostazioni. Quando la visualizzazione viene chiusa, vorrei aggiornare il titolo / testo del UIButtonper riflettere il nuovo stato. Sto chiamando:

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
[myButton setTitle: @"myTitle" forState: UIControlStateApplication];
[myButton setTitle: @"myTitle" forState: UIControlStateHighlighted];
[myButton setTitle: @"myTitle" forState: UIControlStateReserved];
[myButton setTitle: @"myTitle" forState: UIControlStateSelected];
[myButton setTitle: @"myTitle" forState: UIControlStateDisabled];

Ma non sembra mai cambiare dal testo / titolo originale come specificato in IB.


2
Sei sicuro che il codice pubblicato venga chiamato? Hai inserito un BREAKPOINT per dimostrarlo? Puoi pubblicare la firma del tuo delegato?
Pablo Santa Cruz,

3
Per inciso, credo che tu possa fare riferimento a più stati di controllo contemporaneamente: [myButton setTitle: @ "myTitle" forState :( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ...)]; Notare l'uso dell'operatore OR bit per bit in contrasto con l'operatore OR logico (||). In generale, quando si ha a che fare con stati come questo, è possibile eseguirne l'OR insieme a | operatore. Qualcuno mi corregga se sbaglio gravemente. :)
CIFilter

Vorrei che ne avessero uno come UIControlStateAll: D
taber

2
Le combinazioni bit per bit non sembrano funzionare per me in iOS5.
Echilon

Stesso problema qui. Le combinazioni bit per bit non funzionano per me su iOS5. / CC @LucasTizma
znq

Risposte:


52

Il pulsante è specificato come IBOutlet nella classe del controller di visualizzazione ed è collegato correttamente come presa in Interface Builder (trascina ctrl dal nuovo punto di riferimento al proprietario del file e seleziona il tuo oggetto UIButton)? Di solito questo è il problema che ho quando vedo questi sintomi.


Modifica: anche se qui non è il caso, qualcosa del genere può accadere anche se imposti un titolo attribuito al pulsante, quindi provi a cambiare il titolo e non il titolo attribuito.


4
Bingo, ecco, grazie. Vorrei davvero che Objective-C lanciasse una NullPointerException in casi come questo, invece di fingere silenziosamente che sia OK inviare un messaggio a un oggetto nullo. Questo mi morde quasi ogni giorno ... ugh!
George Armhold,

20
ObjC non 'pretende' che sia OK inviare un messaggio a zero, perché è OK inviare messaggi a zero ...
Jasarien

1
Il problema qui non è un puntatore nullo. Il problema è che IB ha configurato un'istanza di UIButton a cui non viene fatto riferimento correttamente nel codice (tramite IBOutlet), quindi non può mai essere manipolata a livello di codice.
CIFilter

112

Ho risolto il problema semplicemente impostando il parametro del titolo per UIControlStateNormal, e funziona automaticamente negli altri stati. Il problema sembra essere quando si imposta un altro UIControlState.

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];


13

Ho scoperto un altro problema. Potrebbe essere un bug introdotto in iOS 5, ma ho pensato di segnalarlo a chiunque altro lo incontrasse.

Se non si imposta alcun testo predefinito per il pulsante nello XIB, nessun testo verrà mai visualizzato se lo si imposta a livello di programmazione. E se imposti il ​​testo nello XIB, qualsiasi testo che successivamente assegni al pulsante a livello di programmazione verrà troncato alla dimensione del testo predefinito.

E infine, se stai mostrando la vista con il tuo pulsante e poi richiami un'altra vista (come un ActionSheet) e poi la chiudi, il testo che hai assegnato al pulsante a livello di codice verrà cancellato e la didascalia del pulsante tornerà a quello che hai impostato su in XIB.


1
Ho notato tutti e tre questi comportamenti ed è sicuramente fastidioso.
Flea

2
Ho avuto il problema del troncamento (cambiando il testo in qualcosa di più lungo a livello di programmazione), quindi ho inserito spazi extra alla fine del testo per "riservare" quello spazio per quando cambio il testo in una parola più lunga. Ha funzionato per me.
mattorb

2
Sembra che la soluzione per questo sia usare il metodo [_button setTitle: @ "title" forState: UIControlStateNormal]; invece di accedere direttamente alla proprietà _button.titleLabel.text. Attenersi alla chiamata al metodo e probabilmente otterrai ciò che desideri.
Rymnel

12

Anche se il problema di Caffeine Coma è stato risolto, vorrei offrire un'altra potenziale causa per la mancata visualizzazione del titolo su un pulsante UIB.

Se imposti un'immagine per il pulsante UIB utilizzando

- (void)setImage:(UIImage *)image forState:(UIControlState)state

Può coprire il titolo. L'ho scoperto nel modo più duro e immagino che alcuni di voi finiscano per leggere questa pagina per lo stesso motivo.

Usa invece questo metodo

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state

per l'immagine del pulsante e il titolo non verranno modificati.

L'ho testato con pulsanti creati a livello di codice e pulsanti creati in un .xib


7

per swift:

button.setTitle("Swift", forState: UIControlState.Normal)                   

4

Si scopre che i documenti ti dicono la risposta! Il pulsante UIB ignorerà la modifica del titolo se ha già una stringa attribuita da utilizzare (con sembra essere l'impostazione predefinita che si ottiene quando si utilizza il generatore di interfacce Xcode).

Ho usato quanto segue:

[self.loginButton 
     setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
     forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];

3

Un'altra possibile causa è questa:

Se tenti di impostare il titolo del pulsante nel (id)initWithNibName: ...metodo, la tua proprietà del pulsante sarà ancora nulla. Non è stato ancora assegnato al pulsante UIB.

Devi essere sicuro di impostare i tuoi pulsanti in un metodo come (void)viewWillLoado (void)viewWillAppear, ma probabilmente non vuoi impostarli più tardi (void)viewDidAppear.


2

A volte può diventare davvero complicato. Il modo più semplice è " aggiornare " la visualizzazione dei pulsanti!

//Do stuff to your button here.  For example:

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];

1

Continuavo ad avere problemi con questo, l'unica soluzione era aggiungere un'immagine e un'etichetta come visualizzazioni secondarie al pulsante uib. Poi ho scoperto che il problema principale era che stavo usando un UIButton con il titolo: Attribuito. Quando l'ho cambiato in Plain, è stato sufficiente impostare titleLabel.text!


1

@funroll ha assolutamente ragione. Qui puoi vedere di cosa avrai bisogno Assicurati che la funzione venga eseguita solo sul thread principale . Se non vuoi gestire i thread puoi fare come questo, ad esempio: creare NSUserDefaults e in ViewDidLoad la condizione di controllo è stato premuto il pulsante in un'altra vista o meno (in un'altra vista impostata in NSUserDefaults informazioni necessarie) e in base alle condizioni impostate il titolo necessario per il tuo UIButton, quindi [yourButton setTitle: @ "Title" forState: UIControlStateNormal];


Questo mi è stato molto utile .. risulta che se chiami setTitle e setNeedsDisplay da un thread in background la vista verrà aggiornata molto più tardi.
user1111828

0

Assicurati di essere nel thread principale.

In caso contrario, salverà comunque il testo del pulsante. Sarà presente quando ispezionerai l'oggetto nel debugger. Ma in realtà non aggiornerà la vista.

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.