UIButtonのタイトル/テキストをプログラムで更新することは可能ですか?
-
06-07-2019 - |
質問
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で指定されている元のテキスト/タイトルから変更されることはありません。
解決
View ControllerクラスでIBOutletとして指定されたボタンがあり、Interface Builderでアウトレットとして適切に接続されていますか(新しい参照アウトレットからファイル所有者へのCtrlドラッグとUIButtonオブジェクトの選択)?これらの症状が見られるとき、それは通常私が抱えている問題です。
編集:ここではそうではありませんが、ボタンに属性タイトルを設定し、属性タイトルではなくタイトルを変更しようとすると、このようなことが起こります。
他のヒント
UIControlStateNormalのタイトルパラメーターを設定するだけで問題を解決し、他の状態でも自動的に動作します。問題は、別のUIControlStateを設定したときのようです。
[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
別の問題を発見しました。これはiOS 5で導入されたバグかもしれませんが、遭遇した他の人には指摘したいと思いました。
XIBのボタンにデフォルトのテキストを設定しない場合、プログラムで設定してもテキストは表示されません。また、XIBにテキストを設定すると、その後プログラムでボタンに割り当てるテキストは、デフォルトのテキストのサイズに切り捨てられます。
最後に、ボタンでビューを表示してから別のビュー(ActionSheetなど)を呼び出して閉じた場合、プログラムでボタンに割り当てたテキストは消去され、ボタンのキャプションはXIBで設定したものは何でも。
Caffeine Comaの問題は解決しましたが、タイトルがUIButtonに表示されない別の原因を提供したいと思います。
を使用してUIButtonの画像を設定した場合
- (void)setImage:(UIImage *)image forState:(UIControlState)state
タイトルをカバーできます。これは難しい方法であることがわかったので、同じ理由でこのページを読む人がいることを想像してください。
代わりにこのメソッドを使用します
- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state
ボタン画像とタイトルは影響を受けません。
プログラムで作成されたボタンと.xibで作成されたボタンでこれをテストしました
Swift 4以降:
button.setTitle("Click", for: .normal)
迅速に:
button.setTitle("Swift", forState: UIControlState.Normal)
ドキュメントで、答えを教えてください! UIButtonは、使用する属性付き文字列が既にある場合、タイトルの変更を無視します(Xcodeインターフェイスビルダーを使用するときに取得するデフォルトのようです)。
次を使用しました:
[self.loginButton
setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil]
forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];
もう1つの考えられる原因は次のとおりです。
(id)initWithNibName:...
メソッドでボタンのタイトルを設定しようとしても、ボタンプロパティはnilのままです。 UIButtonにはまだ割り当てられていません。
(void)viewWillLoad
や(void)viewWillAppear
などのメソッドでボタンを設定していることを確認する必要がありますが、おそらくはしたくないでしょうそれらを(void)viewDidAppear
に設定してください。
時には非常に複雑になることがあります。簡単な方法は、「更新」することです。ボタンビュー!
//Do stuff to your button here. For example:
[mybutton setEnabled:YES];
//Refresh it to new state.
[mybutton setNeedsDisplay];
これで問題が発生し続けました。唯一の解決策は、uibuttonにサブビューとして画像とラベルを追加することでした。それから、主な問題は、タイトルがAttributedのUIButtonを使用していることだとわかりました。プレーンに変更したとき、titleLabel.textを設定するだけでうまくいきました!
@funrollは絶対に正しいです。ここで、必要なものを確認できますメインスレッドでのみ機能が実行されることを確認します。スレッドを処理したくない場合は、たとえば、NSUserDefaultsを作成し、ViewDidLoadでチェッキング条件が別のビューでボタンを押したかどうか(NSUserDefaultsの別のビューセットで必要な情報)および条件セットに必要なタイトルあなたのUIButton、つまり[yourButton setTitle:@" Title" forState:UIControlStateNormal];
メインスレッドにいることを確認してください。
そうでない場合でも、ボタンテキストは保存されます。デバッガでオブジェクトを検査するときにそこにあります。ただし、実際にはビューは更新されません。