44

UIButtonユーザーがクリックしたときに、プログラムで作成したタイトルを変更しようとしています。だから、これはを作成するための私のコードですUIButton:

myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
[myButton setBackgroundColor:[UIColor blackColor]];
[myButton setAlpha:0.7];
[myButton setTitle:@"Hello" forState:UIControlStateNormal];
[myButton addTarget:self action:@selector(userClicked:) forControlEvents:UIControlEventTouchUpInside];

[parentView addSubview:myButton];

そして、私のuserClicked:方法では、次のことを行います。

-(void) userClicked:(UIButton*)button
{
    NSLog(@"USER CLICKED!!!");
    if ([NSThread isMainThread])
    {
        NSLog(@"is main thread");
    }

    [button setTitle:@"Bye" forState:UIControlStateHighlighted];
    [button setTitle:@"Bye" forState:UIControlStateNormal];
    [button setTitle:@"Bye" forState:UIControlStateSelected];

    [self someLengthyComputation];
}

奇妙なことに、出力されたログ メッセージが表示されます。

USER CLICKED!!! 
isMainThread

でも、ボタンのタイトルは変わらない!私は何を間違っていますか?

編集:複数の州のタイトルを設定しても機能しません。

EDIT2:Xcodeのデバッガーウィンドウでボタンの説明を印刷すると、正しいタイトルが表示されます!

Printing description of button->_titleView:
<UIButtonLabel: 0xa4c9310; frame = (95 216; 130 22); text = 'Bye'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xa44f080>>
4

24 に答える 24

51

これは、タイトル テキストを更新するのに役立ちました (iOS 7.1、Xcode 5.1):

button.enabled = FALSE;
[button setTitle:@"Test" forState:UIControlStateNormal];
button.enabled = TRUE;
于 2014-03-20T09:09:58.907 に答える
28

私は同じ問題を抱えていましたが、どこでもattributedTitleを設定していることに気付きました. そのため、タイトルを更新しても、帰属するタイトルには影響しませんでした。

私の解決策:

[button setAttributedTitle:@"" forState:UIControlStateNormal];

それ以外の

[button setTitle:@"" forState:UIControlStateNormal];
于 2014-06-16T17:25:23.140 に答える
21

現時点で、私が行った最短の回避策は次の呼び出しです。

[button setNeedsLayout];

タイトル更新後。

これは iOS 7.1 で発生するようです。以前の iOS バージョンで正しく動作していた (または以前の SDK でコンパイルされた可能性がある) すべてのボタンが、Xcode 5.1.1 SDK 7.1 でコンパイルすると突然動作しなくなりました。

Appleのバグのようです。

于 2014-06-02T09:54:15.300 に答える
12

ストーリーボードを使用して同様の問題がありました。上記の回答を使用して、使用する必要がありました

[mybutton setTitle:@"SomeText" forState:UIControlStateNormal];
[button setNeedsLayout];
[button layoutIfNeeded];

そして、属性インスペクターでボタンのタイプが「システム」ではなく「カスタム」であることを確認する必要がありました。

于 2015-01-09T06:43:06.950 に答える
6

Swift 3から5の場合は、次のようにします。

button.setTitle("My title", for: .normal)

または属性付きテキストの場合、これを使用します:

button.setAttributedTitle(<AttributedString>, for: .normal)
于 2017-03-22T15:41:11.803 に答える
3

ボタン レイアウトの更新の問題である可能性があります.....使用してみてください...

[button setNeedsLayout];
[button layoutIfNeeded];

ボタンにレイアウトの更新を強制します。

于 2014-10-14T14:18:01.517 に答える
2

最後に、私はそれを理解しました。次の 2 つの問題がありました。

1)buttonなかった状態UIControlStateNormal

2) タイトルを設定した直後に、長い計算を実行するメソッドを呼び出していました[self someLengthyComputation]

私は次の方法で問題を解決しました:

1) ボタンのすべての状態のタイトルを設定します。

2)メインスレッドではなく、別のスレッドでその大きな計算を実行します。

私の作業コードは次のとおりです。

-(void) userClicked:(UIButton*)button
{
    NSLog(@"USER CLICKED!!!");
    if ([NSThread isMainThread])
    {
        NSLog(@"is main thread");
    }

    [button setTitle:@"Bye" forState:UIControlStateHighlighted];
    [button setTitle:@"Bye" forState:UIControlStateNormal];
    [button setTitle:@"Bye" forState:UIControlStateSelected];
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        [self someLengthyComputation];
    });
}

回答/コメントしてくださった皆様、本当にありがとうございます!

于 2013-11-14T10:12:34.910 に答える
2

これは些細なことかもしれませんが、ボタン フレーム全体を埋めるボタン イメージ (背景イメージの代わりに) を設定すると、タイトルが右に移動し、非表示になります。その場合は、ボタンの画像を背景画像に変更してみてください。

于 2016-01-19T10:10:26.970 に答える
1

以下を使用する必要はありません。

[button setNeedsLayout];
[button layoutIfNeeded];

代わりに、最初に type を DEFAULT としてCUSTOMに設定します

適用した場合はsetAttributedTitle、次を使用します。

[button setAttributedTitle:[NSAttributedString new] forState:UIControlStateNormal];

それ以外の場合は、何も変更する必要はありません。

テキストの色が変更されていない場合は、同じことを適用してタイトルの色を次のように設定します。

[button setTitleColor:[any_color] forState:UIControlStateNormal];
于 2016-07-23T12:38:33.897 に答える
0

パラメーターとして渡された「ボタン」が myButton.Anyway であるかどうかは疑問です.とにかく、myButton がメンバー変数である場合は、[myButton setTitle:@"Bye" forState:UIControlStateNormal]; を実行できます。

于 2013-11-14T09:32:32.670 に答える
0

インターフェイスまたはビュー/ビューコントローラーの実装部分で、ボタンをプロパティとして宣言してみてください

@property(nonatomic,strong) UIButton* myButton;

それからそれを作成します

self.myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
[_myButton setBackgroundColor:[UIColor blackColor]];
...

それはうまくいくはずです。本当の理由は聞かないでください - ARC / 現代のメモリ管理がすべてだと思います..

編集:

実装でボタンの参照を保持している場合にも機能するはずです..

@implementation myViewController
{
    UIButton* myButton;
}

-(void)createButton
{
    myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
    [myButton setBackgroundColor:[UIColor blackColor]];
    ...
}

...
于 2016-09-05T19:00:03.670 に答える
-1

UIButton にテキストを設定する前に、必ず addSubview を実行してください。

于 2014-09-03T21:01:47.943 に答える