2009-06-23 19 views
89

Ich habe eine UIButton, die, wenn sie gedrückt wird, eine neue Ansicht öffnet, wo der Benutzer einige Einstellungen ändern kann. Wenn die Ansicht ausgeblendet wird, möchte ich den Titel/den Text der UIButton aktualisieren, um den neuen Status widerzuspiegeln. Ich rufe an:ist es möglich, UIButton Titel/Text programmatisch zu aktualisieren?

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

Aber es scheint sich nie von dem ursprünglichen Text/Titel zu ändern, wie in IB angegeben.

+2

Sind Sie sicher, dass der gepostete Code aufgerufen wird? Hast du einen BREAKPOINT gesetzt, um das zu beweisen? Können Sie die Unterschrift Ihres Delegierten posten? –

+3

Nebenbei glaube ich, dass Sie mehrere Steuerstatus gleichzeitig verweisen können: [myButton setTitle: @ "myTitle" forState :(UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ...)]; Beachten Sie die Verwendung des bitweisen OR-Operators im Gegensatz zum logischen OR-Operator (||). Im Allgemeinen, wenn Sie mit solchen Zuständen zu tun haben, können Sie sie zusammen mit dem | Operator. Jemand korrigiert mich, wenn ich mich grob täusche. :) – LucasTizma

+0

Ich wünschte, sie hätten einen wie UIControlStateAll: D – taber

Antwort

48

Haben Sie die Schaltfläche in Ihrer View-Controller-Klasse als IBOutlet angegeben, und ist sie als Schnittstelle im Interface Builder korrekt verbunden (Ziehen Sie von der neuen Referenzierungsstelle zum Dateieigner und wählen Sie Ihr UIButton-Objekt aus)? Das ist normalerweise das Problem, das ich habe, wenn ich diese Symptome sehe.


Edit: Während es hier nicht der Fall ist, so etwas wie dies auch, wenn Sie einen zugeschrieben Titel auf die Schaltfläche Set passieren kann, dann versuchen Sie den Titel und nicht die zugeschrieben Titel zu ändern.

+4

Bingo, das war es, danke. Ich wünschte wirklich, dass Objective-C in solchen Fällen einfach eine NullPointerException werfen würde, anstatt still zu tun, dass es in Ordnung ist, eine Nachricht an ein Null-Objekt zu senden. Das beißt mich fast täglich ... äh! –

+20

ObjC gibt nicht vor, dass es OK ist, eine Nachricht an null zu senden, weil es * OK ist, Nachrichten an null 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 ordnungsgemäß verwiesen wird, so dass sie niemals programmgesteuert manipuliert werden kann. – LucasTizma

104

Ich löste das Problem, nur den Titelparameter für UIControlStateNormal, und es arbeitet automatisch auf den anderen Staaten. Das Problem scheint zu sein, wenn Sie einen anderen UIControlState einstellen.

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

Das ist der Trick, der mich rettet :) –

+0

das ist ein Lebensretter. Ich habe versucht, dies zu tun, indem ich die Eigenschaft titleLabel für Stunden ändere. Vielen Dank. – Natasha

+0

Yotes ist korrekt. –

11

Obwohl das Problem von Caffeine Coma gelöst wurde, möchte ich eine weitere mögliche Ursache für den Titel, der nicht auf einem UIButton angezeigt wird, anbieten.

Wenn Sie ein Bild für die UIButton gesetzt

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

mit Es kann den Titel ab. Ich fand das auf die harte Tour und stelle mir vor, dass einige von Ihnen aus dem gleichen Grund diese Seite lesen.

Verwenden Sie diese Methode anstelle

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

für die Schaltfläche Bild und der Titel wird nicht berührt.

Getestet habe ich diese mit programmatisch erstellt Tasten und in einem .xib erstellten Tasten

12

ich ein anderes Problem entdeckt. Es könnte ein Fehler sein, der in iOS 5 eingeführt wurde, aber ich dachte, ich würde ihn auf jeden anderen hinweisen, der darauf stößt.

Wenn Sie keinen Standardtext für die Schaltfläche in der XIB festlegen, wird kein Text angezeigt, wenn Sie ihn programmgesteuert festlegen. Und wenn Sie Text in der XIB festlegen, wird jeder Text, den Sie der Schaltfläche programmatisch zuweisen, auf die Größe des Standardtexts gekürzt.

Und schließlich, wenn Sie die Ansicht mit Ihrer Schaltfläche anzeigen und dann eine andere Ansicht (wie ein ActionSheet) aufrufen und dann ablehnen, wird der Text, den Sie der Schaltfläche programmgesteuert zugewiesen haben, gelöscht und die Schaltflächenbeschriftung wird zurückgegeben zu was auch immer Sie in der XIB einrichten.

+1

Ich habe alle drei dieser Verhaltensweisen bemerkt und es ist sicherlich nervig. – Flea

+0

kann jemand dieses Problem lösen? – BUDDAx2

+2

Ich hatte das Kürzungsproblem (indem ich den Text programmatisch etwas länger änderte), also platziere ich extra Leerzeichen am Ende des Textes, um diesen Platz zu 'reservieren', wenn ich den Text zu einem längeren Wort ändere. Das hat für mich funktioniert. – mattorb

3

Eine weitere mögliche Ursache ist diese:

Wenn Sie auf die Schaltfläche Titel der (id)initWithNibName: ... Methode zu setzen versuchen, dann sind Sie Schaltfläche Eigenschaft wird noch gleich null. Es wurde dem UIButton noch nicht zugewiesen.

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

0

Stellen Sie sicher, dass Sie auf dem Hauptthread sind.

Wenn nicht, wird der Schaltflächentext gespeichert. Es wird vorhanden sein, wenn Sie das Objekt im Debugger untersuchen. Aber es wird die Ansicht nicht wirklich aktualisieren.

1

Ich hatte weiterhin Probleme damit, die einzige Lösung war ein Bild und Label als Unteransichten zum uibutton hinzuzufügen. Dann stellte ich fest, dass das Hauptproblem darin bestand, dass ich einen UIButton mit dem Titel: Attributiert verwendete. Als ich es in Plain geändert habe, hat es nur der titelLabel.text geschafft!

2

Manchmal kann es wirklich kompliziert werden. Der einfache Weg ist "aktualisieren" die Schaltfläche Ansicht!

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

[mybutton setEnabled:YES]; 

//Refresh it to new state. 

[mybutton setNeedsDisplay]; 
1

@funroll ist absolut richtig. Hier können Sie sehen, was Sie benötigen Make sure function runs on main thread only. Wenn Sie nicht mit Threads umgehen wollen, können Sie dies zum Beispiel tun: create NSUserDefaults und in ViewDidLoad checking Bedingung Taste in einer anderen Ansicht gedrückt wurde oder nicht (in einer anderen Ansicht in NSUserDefaults benötigte Informationen benötigt) und abhängig von den Bedingungen gesetzt Titel für Ihr UIButton, also [yourButton setTitle: @ "Titel" forState: UIControlStateNormal];

+0

Das war sehr nützlich für mich .. stellt sich heraus, wenn Sie setTitle und setNeedsDisplay von einem Hintergrund-Thread aufrufen wird die Ansicht viel später aktualisiert werden. – user1111828

4

Es stellt sich heraus, dass die Dokumentation Ihnen die Antwort gibt! Das UIButton ignoriert die Änderung des Titels, wenn es bereits eine attributierte Zeichenfolge zu verwenden (mit scheint der Standard zu sein, wenn Sie Xcode interface builder verwenden).

habe ich die folgenden:

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

Swift:

button.setTitle("Click", forState: .Normal) 
6

für swift:

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

Swift Diese

button.setTitle("metin", forState: .Normal) 
probieren
Verwandte Themen