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


96

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で指定されている元のテキスト/タイトルから変更されているようには見えません。


2
投稿されたコードが呼び出されていることを確認しますか?それを証明するためにBREAKPOINTを配置しましたか?代理人の署名を投稿できますか?
Pablo Santa Cruz、

3
余談ですが、一度に複数のコントロールの状態を参照できると思います:[myButton setTitle:@ "myTitle" forState :( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ... 論理OR演算子(||)ではなく、ビット単位のOR演算子を使用していることに注意してください。一般に、このような状態を処理しているときは、|と一緒にORすることができます。オペレーター。私がひどく間違っている場合、誰かが私を訂正します。:)
CIFilter 2009年

UIControlStateAll:D
taber

2
iOS5では、ビットごとの組み合わせが機能しないようです。
エシロン

ここで同じ問題。iOS5では、ビットごとの組み合わせは機能しません。/ CC @LucasTizma
znq

回答:


52

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


編集:ここではそうではありませんが、ボタンに属性付きタイトルを設定して、属性付きタイトルではなくタイトルを変更しようとすると、このようなことが発生する可能性があります。


4
ビンゴ、それでよかった。このような場合、Objective-CがNullPointerExceptionをスローして、メッセージをnilオブジェクトに送信しても問題がないように見せかけるのではなく、本当に望んでいます。これはほぼ毎日私を噛みます...うーん!
ジョージアームホールド09年

20
ためにObjCは、nilにメッセージを送信するためにそのOK「をふり」ではないんです nilにメッセージを送信するためにOK ...
Jasarien

1
ここでの問題はnilポインタではありません。問題は、IBがコード内で(IBOutletを介して)正しく参照されていないUIButtonインスタンスをセットアップしたため、プログラムで操作できないことです。
CIFilter 2009年

112

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

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


13

別の問題を発見しました。iOS 5で導入されたバグかもしれませんが、遭遇した人なら誰でも指摘できると思いました。

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

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


1
私はこれら3つの動作すべてに気づきましたが、それは確かに迷惑です。
ノミ

2
切り捨ての問題(プログラムでテキストをより長いものに変更)があったため、テキストの最後に余分なスペースを入れて、テキストをより長い単語に変更するときにそのスペースを「予約」します。それでうまくいきました。
mattorb 2012年

2
これに対する修正は、メソッド[_button setTitle:@ "title" forState:UIControlStateNormal]を使用することです。_button.titleLabel.textプロパティに直接アクセスする代わりに。メソッドの呼び出しに固執すれば、おそらく必要なものが得られます。
Rymnel 2014年

12

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

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

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

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

代わりにこの方法を使用してください

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

ボタンの画像とタイトルには影響しません。

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



4

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

私は以下を使用しました:

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

3

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

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

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


2

時にはそれは本当に複雑になることがあります。簡単な方法は、ボタンビューを「更新」することです。

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

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];

1

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


1

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


これは私にとって非常に役に立ちました。バックグラウンドスレッドからsetTitleとsetNeedsDisplayを呼び出すと、ビューは後で更新されるようになります。
user1111828 2016年

0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.