2016-08-03 18 views
0

Ich habe dieses Problem mit einem benutzerdefinierten UIView, wo ich eine UIButton subview haben, möchte ich der Schaltfläche Text auf Initialisierung setzen, basierend auf einem gewissen Zustand wie folgt aus:iOS SDK: Unterschied zwischen UIButton setTitleForState und UIButton titleLabel.text

- (void)awakeFromNib { 
    [super awakeFromNib]; 
//check for some conditions 
[email protected]"Some Title"; 
} 

Es geschieht nichts, und die Text der Schaltfläche ist das gleiche wie in der nib-Datei definiert ist, aber wenn ich die Umsetzung zu ändern:

- (void)awakeFromNib { 
    [super awakeFromNib]; 
//check for some conditions 
    [self.testButton setTitle:@"Some Title" forState:UIControlStateNormal]; 
} 

Es funktioniert wie erwartet.

Kann mir bitte jemand den Unterschied zwischen den beiden Ansätzen erklären? und wann man jedes benutzt?

EDIT:

die vorgeschlagene Antwort meine Situation nicht erklären, testete ich der Schaltfläche Text aus einer anderen Aktion der Schaltfläche Ändern wie folgt aus:

- (IBAction)otherButtonClicked:(id)sender { 
[email protected]"Some Title"; 
} 

und den Text der Schaltfläche geändert. Ich möchte nur dieses Verhalten verstehen.

+0

Mögliche Duplikate von [Warum funktioniert nicht ändern UIButton Text über Punktsyntax?] (Http: // stackoverflow.com/questions/7000796/why-does-not-work-changing-uibutton-text-via-dot-syntax) – SHN

Antwort

2

Genaue Antwort ist

titleLabel

nicht das Label-Objekt verwenden Sie die Textfarbe oder die Schattenfarbe einzustellen. Verwenden Sie stattdessen setTitleColor: forState: und setTitleShadowColor: forState: Methoden dieser Klasse, um diese Änderungen vorzunehmen.

Die Eigenschaft titleLabel gibt einen Wert zurück, auch wenn die Schaltfläche noch nicht angezeigt wurde. Der Wert der Eigenschaft ist null für System Schaltflächen.

setTitle

Mit dieser Methode können den Titel für die Taste. Der von Ihnen angegebene Titel leitet seine Formatierung vom zugeordneten Label-Objekt der Schaltfläche ab. Wenn Sie sowohl einen Titel als auch einen attributierten Titel für die Schaltfläche festlegen, bevorzugt die Schaltfläche die Verwendung des zugeordneten Titels über diesen.

Zumindest sollten Sie den Wert für den Normalzustand einstellen. Wenn für einen Status kein -Titel angegeben ist, wird standardmäßig der mit dem UIControlStateNormal-Status verknüpfte Titel verwendet. Wenn der Wert für UIControlStateNormal nicht festgelegt ist, wird für die Eigenschaft standardmäßig der Wert des Systems verwendet.

+0

Dies bedeutet also, dass in der watchFromNib-Methode die Schaltfläche immer noch unsichtbar ist, also die Änderung der titleLabel.text hat Kein Effekt? –

+0

Auch wenn die Schaltfläche sichtbar ist, wurde der Text nicht angezeigt.Es ist Null. – user3182143

+1

Danke, das erklärt es gut –

2

Title-Label-Zugriff ist gegeben, um andere Eigenschaften des Etiketts wie font anzupassen, aber Einstellung titleLabel Text funktioniert nicht.

Es ist, weil UIButton Klasse hat innere Implementierung, um den Text basierend auf verschiedenen Zuständen der Schaltfläche wie selected/highlighted usw., die Beschriftung Text überschreibt.

1

Die akzeptierte Antwort ist richtig, ich dies gerade hier fügen Sie ein bisschen zu erarbeiten (Kommentare zu kurz sind)

Es gibt nicht viel, hier zu erklären. Der Titel ist einfach nicht gemeint, um den Text überhaupt zu setzen. Meine Vermutung ist, dass die internen Funktionen von UIButton den Text auch anderswo speichern (für verschiedene Zustände). Es verwendet einen normalen UILabel, um das schließlich anzuzeigen, weil das bequem und einfach zu verstehen ist. Wenn Sie den Text dafür setzen, ändert sich die Schaltfläche nicht in allen Fällen, was wahrscheinlich vom Zeichnungszyklus abhängt. Ich nehme an, wenn es gezeichnet, ausgelegt oder ähnlich ist, "ersetzt" es den Text des Etiketts mit seiner anderen gespeicherten Variante irgendwann.

Nun könnte man sich wundern, warum Apple dann die UILabel entlarvt hat und damit den Text dann editierbar zu machen schien.

Legacy ist wahrscheinlich ein Aspekt dieser Entscheidung (IIRC können Sie einmal den Titel der Schaltfläche so festlegen). Obwohl alter Code nicht zum gewünschten Verhalten führt, stürzte er zumindest nicht sofort ab. Außerdem möchte viel Code einfach den Text bekommen und erwartet ein Label, das wie immer einwandfrei funktioniert.

Zweitens, scheint es völlig anders zu sein, es zu übertreiben. Um das zu vermeiden, müssten sie eine Unterklasse von UILabel verwenden, die verhindert, dass Sie den Text oder etwas setzen und verwenden können. Oder überspringen Sie es (und damit Legacy-Support) vollständig und bieten nur die setTitle:forState: Methode. Das scheint ein bisschen viel für einen einfachen Textcontainer wie ein Label zu sein.

Letztendlich ist es eine Design-Wahl von Apple. Sie können den Titeltext nicht direkt eingeben, und es gibt keinen Fall, in dem Sie es anders als mit setTitle:forState: