Domanda

Ho un UIButton , che quando viene premuto, fa apparire una nuova vista in cui l'utente può modificare alcune impostazioni. Quando la vista viene respinta, vorrei aggiornare il titolo / testo del UIButton per 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.

È stato utile?

Soluzione

Hai il pulsante specificato come IBOutlet nella classe del controller della vista ed è collegato correttamente come outlet in Interface Builder (trascina ctrl dal nuovo outlet di riferimento al proprietario del file e seleziona l'oggetto UIButton)? Questo di solito è il problema che ho quando vedo questi sintomi.


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

Altri suggerimenti

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

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

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

Se non si imposta alcun testo predefinito per il pulsante in XIB, non verrà mai visualizzato alcun testo se lo si imposta a livello di codice. E se imposti il ??testo in XIB, qualsiasi testo che successivamente assegnerai al pulsante a livello di codice verrà troncato alla dimensione del testo predefinito.

E infine, se stai mostrando la vista con il tuo pulsante e poi invochi un'altra vista (come un foglio di azione) e poi lo elimini, il testo assegnato al pulsante a livello di codice verrà cancellato e la didascalia del pulsante tornerà a qualunque cosa tu abbia impostato nella XIB.

Anche se il problema del caffeina coma è stato risolto, vorrei offrire un'altra potenziale causa per il titolo che non compare su un UIButton.

Se imposti un'immagine per l'UIButton usando

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

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

Usa questo metodo invece

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

per l'immagine del pulsante e il titolo non saranno interessati.

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

A partire da Swift 4:

    button.setTitle("Click", for: .normal)

per swift:

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

Si scopre che i documenti ti dicono la risposta! Il pulsante UIB ignorerà la modifica del titolo se ha già una stringa attribuita da usare (con sembra essere il valore predefinito che ottieni quando usi il builder di interfaccia Xcode).

Ho usato quanto segue:

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

Un'altra possibile causa è questa:

Se si tenta di impostare il titolo del pulsante nel metodo (id) initWithNibName: ... , la proprietà del pulsante sarà comunque nulla. Non è stato ancora assegnato a UIButton.

Devi essere sicuro di impostare i pulsanti in un metodo come (void) viewWillLoad o (void) viewWillAppear , ma probabilmente non vorrai impostali fino a (void) viewDidAppear .

A volte può diventare davvero complicato. Il modo più semplice è " aggiornare " la vista pulsante!

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

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];

Continuavo ad avere problemi con questo, l'unica soluzione era quella di aggiungere un'immagine e un'etichetta come sottoview a uibutton. Poi ho scoperto che il problema principale era che stavo usando un UIButton con titolo: attribuito. Quando l'ho cambiato in Plain, solo l'impostazione del titleLabel.text ha funzionato!

@funroll ha assolutamente ragione. Qui puoi vedere di cosa avrai bisogno Assicurati che la funzione venga eseguita solo sul thread principale . Se non si desidera gestire i thread, è possibile fare ciò ad esempio: creare NSUserDefaults e in ViewDidLoad condizione di cheking è 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 titolo necessario per il tuo UIButton, quindi [yourButton setTitle: @ " Title " forState: UIControlStateNormal];

Assicurati di essere sul thread principale.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top