web-dev-qa-db-ja.com

UIButtonのタイトル/テキストをプログラムで更新することは可能ですか?

UIButtonがあります。これを押すと、ユーザーが設定を変更できる新しいビューが表示されます。ビューが閉じられたら、UIButtonのタイトル/テキストを更新して、新しい状態を反映させたいと思います。私は呼んでいます:

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

ただし、IBで指定されている元のテキスト/タイトルから変更されることはありません。

93
George Armhold

View ControllerクラスでIBOutletとして指定されたボタンがあり、Interface Builderでアウトレットとして適切に接続されていますか(新しい参照アウトレットからファイル所有者へのCtrlドラッグとUIButtonオブジェクトの選択)?これらの症状が見られるとき、それは通常私が抱えている問題です。


編集:ここではそうではありませんが、ボタンにattributed titleを設定し、属性タイトルではなくタイトルを変更しようとすると、このようなことが起こります。

51
Ken Pespisa

UIControlStateNormalのタイトルパラメーターを設定するだけで問題が解決し、他の状態でも自動的に機能します。別のUIControlStateを設定するときに問題があるようです。

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

別の問題を発見しました。それはiOS 5で導入されたバグかもしれませんが、私はそれを遭遇した他の誰にも指摘したいと思いました。

XIBのボタンにデフォルトのテキストを設定しない場合、プログラムで設定してもテキストは表示されません。また、XIBでテキストを設定すると、その後プログラムでボタンに割り当てるテキストは、デフォルトのテキストのサイズに切り捨てられます。

最後に、ボタンでビューを表示してから、別のビュー(ActionSheetなど)を呼び出してそれを閉じると、プログラムでボタンに割り当てたテキストが消去され、ボタンのキャプションが設定したものに戻りますXIBでアップ。

13
Oscar

Caffeine Comaの問題は解決しましたが、タイトルがUIButtonに表示されない別の潜在的な原因を提供したいと思います。

を使用してUIButtonの画像を設定した場合

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

タイトルをカバーできます。私はこれを困難な方法で見つけて、同じ理由でこのページを読む人がいることを想像します。

代わりにこのメソッドを使用してください

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

ボタンの画像とタイトルは影響を受けません。

プログラムで作成したボタンと.xibで作成したボタンでこれをテストしました

12
Jesse Black

Swift 4:現在

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

for Swift:

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

ドキュメントが答えを教えてくれます! UIButtonは、使用する属性付き文字列が既にある場合、タイトルの変更を無視します(Xcodeインターフェイスビルダーを使用するときに取得するデフォルトのようです)。

私は次を使用しました:

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

考えられるもう1つの原因は次のとおりです。

(id)initWithNibName: ...メソッドでボタンのタイトルを設定しようとしても、ボタンプロパティはnilのままです。 UIButtonにはまだ割り当てられていません。

(void)viewWillLoad(void)viewWillAppearなどのメソッドでボタンを設定していることを確認する必要がありますが、(void)viewDidAppearのように遅く設定したくないでしょう。

3
Ramsey

時には非常に複雑になることがあります。簡単な方法は、「refresh」ボタンビューです!

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

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];
2
Mike Rapadas

@funrollは絶対に正しいです。ここで、必要なものを確認できます 関数がメインスレッドでのみ実行されることを確認してください 。スレッドを処理したくない場合は、たとえば、NSUserDefaultsを作成し、ViewDidLoadでチェッキング条件が別のビューでボタンを押したかどうか(NSUserDefaultsで設定された別のビューで必要な情報)および条件セットに必要なタイトルUIButton、つまり[yourButton setTitle:@ "Title" forState:UIControlStateNormal];

1
daleijn

私はこれに引き続き問題を抱えていました。唯一の解決策は、uibuttonにサブビューとして画像とラベルを追加することでした。それから、主な問題は、タイトルがAttributedのUIButtonを使用していることだとわかりました。プレーンに変更したとき、titleLabel.textを設定するだけでうまくいきました!

1
Mark

メインスレッドにいることを確認してください。

そうでない場合でも、ボタンテキストは保存されます。デバッガでオブジェクトを検査するときにそこにあります。ただし、実際にはビューは更新されません。

0
funroll