Ist es möglich, UIButton-Titel / Text programmgesteuert zu aktualisieren?

96

Ich habe eine UIButton, die beim Drücken eine neue Ansicht aufruft, in der der Benutzer einige Einstellungen ändern kann. Wenn die Ansicht geschlossen wird, möchte ich den Titel / Text von aktualisieren UIButton, um den neuen Status wiederzugeben. Ich rufe an:

[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];

Es scheint sich jedoch nie vom ursprünglichen Text / Titel zu ändern, wie in IB angegeben.

George Armhold
quelle
2
Sind Sie sicher, dass der gebuchte Code aufgerufen wird? Haben Sie einen BREAKPOINT platziert, um dies zu beweisen? Können Sie die Unterschrift Ihres Delegierten veröffentlichen?
Pablo Santa Cruz
3
Abgesehen davon glaube ich, dass Sie mehrere Steuerungszustände gleichzeitig referenzieren können: [myButton setTitle: @ "myTitle" forState :( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ...)]; Beachten Sie die Verwendung des bitweisen ODER-Operators im Gegensatz zum logischen ODER-Operator (||). Wenn Sie mit solchen Zuständen zu tun haben, können Sie sie im Allgemeinen zusammen mit | ODER ODER verknüpfen Operator. Jemand korrigiert mich, wenn ich mich grob irre. :)
CIFilter
Ich wünschte, sie hätten eine wie UIControlStateAll: D
Taber
2
Die bitweisen Kombinationen scheinen für mich in iOS5 nicht zu funktionieren.
Echilon
Gleiches Problem hier. Bitweise Kombinationen funktionieren bei iOS5 nicht. / CC @LucasTizma
znq

Antworten:

52

Haben Sie die Schaltfläche als IBOutlet in Ihrer View Controller-Klasse angegeben und ist sie als Schnittstelle im Interface Builder ordnungsgemäß verbunden (ziehen Sie bei gedrückter Strg-Taste vom neuen Referenzierungs-Outlet zum Dateibesitzer und wählen Sie Ihr UIButton-Objekt aus)? Das ist normalerweise das Problem, das ich habe, wenn ich diese Symptome sehe.


Bearbeiten: Obwohl dies hier nicht der Fall ist, kann so etwas auch passieren, wenn Sie der Schaltfläche einen zugewiesenen Titel zuweisen und dann versuchen, den Titel und nicht den zugewiesenen Titel zu ändern.

Ken Pespisa
quelle
4
Bingo, das war es, danke. Ich wünschte wirklich, Objective-C würde in solchen Fällen nur eine NullPointerException auslösen, anstatt stillschweigend vorzutäuschen, dass es in Ordnung ist, eine Nachricht an ein Null-Objekt zu senden. Das beißt mich fast täglich ... ugh!
George Armhold
20
ObjC gibt nicht vor, eine Nachricht an nil zu senden, da es in Ordnung ist, Nachrichten an nil zu senden ...
Jasarien
1
Das Problem hier ist kein Nullzeiger. Das Problem ist, dass IB eine UIButton-Instanz eingerichtet hat, auf die im Code (über IBOutlet) nicht richtig verwiesen wird, sodass sie niemals programmgesteuert bearbeitet werden kann.
CIFilter
112

Ich habe das Problem gelöst, indem ich nur den Titelparameter für UIControlStateNormal festgelegt habe, und es funktioniert automatisch in den anderen Zuständen. Das Problem scheint zu sein, wenn Sie einen anderen UIControlState festlegen.

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
Yotes
quelle
15

Ab Swift 4:

    button.setTitle("Click", for: .normal)
Vlad Spreys
quelle
13

Ich habe ein anderes Problem entdeckt. Es mag ein Fehler sein, der in iOS 5 eingeführt wurde, aber ich dachte, ich würde ihn jedem anderen empfehlen, der darauf stößt.

Wenn Sie in XIB keinen Standardtext für die Schaltfläche festlegen, wird niemals ein Text angezeigt, wenn Sie ihn programmgesteuert festlegen. Wenn Sie Text in der XIB festlegen, wird jeder Text, den Sie anschließend programmgesteuert der Schaltfläche zuweisen, auf die Größe des Standardtexts abgeschnitten.

Wenn Sie schließlich die Ansicht mit Ihrer Schaltfläche anzeigen und dann eine andere Ansicht (wie ein Aktionsblatt) aufrufen und dann schließen, wird der Text, den Sie der Schaltfläche programmgesteuert zugewiesen haben, gelöscht und die Schaltflächenbeschriftung kehrt zu dem von Ihnen festgelegten Wert zurück oben in der XIB.

Oscar
quelle
1
Ich habe alle drei dieser Verhaltensweisen bemerkt und es ist sicherlich ärgerlich.
Floh
2
Ich hatte das Problem mit dem Abschneiden (programmgesteuertes Ändern des Textes in etwas längeres), daher habe ich am Ende des Textes zusätzliche Leerzeichen eingefügt, um diesen Platz für das Ändern des Textes in ein längeres Wort zu reservieren. Das hat bei mir funktioniert.
Mattorb
2
Es scheint, dass das Problem darin besteht, die Methode [_button setTitle: @ "title" forState: UIControlStateNormal] zu verwenden. anstatt direkt auf die Eigenschaft _button.titleLabel.text zuzugreifen. Bleiben Sie beim Methodenaufruf und Sie werden wahrscheinlich bekommen, was Sie wollen.
Rymnel
12

Obwohl das Problem mit Caffeine Coma behoben wurde, möchte ich eine weitere mögliche Ursache dafür angeben, dass der Titel nicht auf einem UIButton angezeigt wird.

Wenn Sie mit ein Bild für den UIButton festlegen

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

Es kann den Titel abdecken. Ich habe das auf die harte Tour herausgefunden und stelle mir vor, dass einige von Ihnen diese Seite aus demselben Grund lesen.

Verwenden Sie stattdessen diese Methode

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

für das Schaltflächenbild und den Titel werden nicht beeinflusst.

Ich habe dies mit programmgesteuert erstellten Schaltflächen und Schaltflächen getestet, die in einer .xib erstellt wurden

Jesse Black
quelle
7

für schnell:

button.setTitle("Swift", forState: UIControlState.Normal)                   
Dara Tith
quelle
4

Es stellt sich heraus, dass die Dokumente Ihnen die Antwort geben! Der UIButton ignoriert die Titeländerung, wenn bereits eine zugewiesene Zeichenfolge verwendet werden kann (mit scheint die Standardeinstellung zu sein, die Sie bei Verwendung des Xcode Interface Builder erhalten).

Ich habe folgendes verwendet:

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

Eine weitere mögliche Ursache ist folgende:

Wenn Sie versuchen, den Titel der Schaltfläche in der (id)initWithNibName: ... Methode festzulegen, ist Ihre Schaltflächeneigenschaft weiterhin Null. Es wurde dem UIButton noch nicht zugewiesen.

Sie müssen sicher sein, dass Sie Ihre Schaltflächen in einer Methode wie (void)viewWillLoadoder einstellen (void)viewWillAppear, aber Sie möchten sie wahrscheinlich nicht so spät wie möglich einstellen (void)viewDidAppear.

Ramsey
quelle
2

Manchmal kann es sehr kompliziert werden. Der einfache Weg ist, die Schaltflächenansicht zu " aktualisieren "!

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

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];
Mike Rapadas
quelle
1

Ich hatte immer wieder Probleme damit. Die einzige Lösung bestand darin, dem Uibutton ein Bild und eine Beschriftung als Unteransichten hinzuzufügen. Dann stellte ich fest, dass das Hauptproblem darin bestand, dass ich einen UIButton mit dem Titel Attributed verwendete. Als ich es in Plain geändert habe, hat es den Trick gemacht, nur den titleLabel.text zu setzen!

Kennzeichen
quelle
1

@funroll ist absolut richtig. Hier können Sie sehen, was Sie benötigen. Stellen Sie sicher, dass die Funktion nur im Hauptthread ausgeführt wird . Wenn Sie sich nicht mit Threads befassen möchten, können Sie dies folgendermaßen tun: NSUserDefaults erstellen und in ViewDidLoad wurde die Suchbedingung in einer anderen Ansicht auf die Schaltfläche gedrückt oder nicht (in einer anderen Ansicht in NSUserDefaults benötigte Informationen) und abhängig von den Bedingungen, für die der Titel benötigt wird Ihr UIButton, also [yourButton setTitle: @ "Title" forState: UIControlStateNormal];

daleijn
quelle
Dies war sehr nützlich für mich. Wenn Sie setTitle und setNeedsDisplay aus einem Hintergrund-Thread aufrufen, wird die Ansicht viel später aktualisiert.
user1111828
0

Stellen Sie sicher, dass Sie sich im Haupt-Thread befinden.

Wenn nicht, wird der Schaltflächentext weiterhin gespeichert. Es wird dort sein, wenn Sie das Objekt im Debugger untersuchen. Die Ansicht wird jedoch nicht aktualisiert.

Funroll
quelle