web-dev-qa-db-ja.com

メインスレッドでUIButtonタイトルテキストを更新しても更新されない

ユーザーがクリックしたときに、プログラムで作成した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>>
39
neutrino

これはタイトルテキスト(iOS 7.1、Xcode 5.1)を更新するために私のために働いた:

button.enabled = FALSE;
[button setTitle:@"Test" forState:UIControlStateNormal];
button.enabled = TRUE;
47
Walter Schurter

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

私の解決策:

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

の代わりに

[button setTitle:@"" forState:UIControlStateNormal];
24
Jeffrey Sun

現時点で、私がやってきた最も短い仕事は次のように電話することです。

[button setNeedsLayout];

タイトルを更新した後。

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

Appleのバグのようです。

20
Lukasz

ストーリーボードを使用して同様の問題が発生しました。上記の答えを使用して、私は使用しなければなりませんでした

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

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

10
user3000868

これが役立つかどうかを確認してください...ボタンがクリックされたとき、buttonToggledの条件を確認してください... changeButtonTextのような関数がある場合は以下のように

-(IBAction)changeButtonText:(id)sender {
    if (!buttonToggled) {
        [sender setTitle:@"Initial Text" forState:UIControlStateNormal];
        buttonToggled = YES;
    } else {
        [sender setTitle:@"Alternative Text" forState:UIControlStateNormal];
        buttonToggled = NO;
    }
}
7
bachman

コードにはいくつかの問題があります。

ボタンにコールバックを割り当てています:

@selector(userClicked:)

しかし、あなたのコードは別の方法にあります:

-(void)userTapOnTapToRefreshView:(UIButton*)button

これを修正するには、次のようなものを実装する必要があります。

-(void)userClicked:(id)sender
{
    [(UIButton*)sender setTitle:@"Bye" forState:UIControlStateNormal];
}

また、コードのこの部分は私にとって意味がありません:

[parentView myButton];

次のように変更してみてください。

[parentView addSubview:myButton];

それが役立つことを願っています:)

6
Flar

IOS 7では、UIButtonのタイトルは無効にされても更新されません。 iOS 7のバグのようです。

回避策として、通常のタイトルと無効なタイトルの両方を更新します。できます!

[button setTitle:title forState:UIControlStateNormal];
[button setTitle:title forState:UIControlStateDisabled];
5
ccoroom

私の場合、すべてを試しましたが、何も機能していませんでした。次に、ボタンの種類をシステムからストーリーボードからカスタムに変更しました。ブーム!すべてが正常に動作し始めました。

これは少し遅れており、Walter Schurterの応答に多少関連しています。

7.1に更新するまでボタンテキストが正しく設定されていた同様の問題がありました。次に、ボタンが無効になっているので、テキストを表示するには、無効状態のタイトルの色とタイトルテキストを設定する必要がありました。その後、すべてが魅力のように機能しました!

4
dragonflyesque

これを試して:

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

または:

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

Void関数を変更することもできます。

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

    [myButton setTitle:@"Bye" forState:UIControlStateNormal];
}
3
Nikos M.

Swiftから5の場合、次を使用します。

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

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

button.setAttributedTitle(<AttributedString>, for: .normal)
3
zero3nna

ボタンの種類を「システム」ではなく「カスタム」に変更すると、期待どおりに機能します:)

3
Pulkit Arora

UIButtonの有効な状態については、Appleは7.1で何かを変更しましたが、無効な状態のUIButtonがある場合、タイトルを変更することはできません。それだけです。

Appleのおかげで、私は10分を失いました。正常に動作していたアプリのデバッグ。

今朝発見したばかりで、昨日XCodeを5.1.1に、iOSを7.1に更新しました

2
Kiko Seijo

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

2
dobranoc

ボタンレイアウトの更新の問題である可能性があります。

[button setNeedsLayout];
[button layoutIfNeeded];

ボタンを押してレイアウトを更新します。

2
iOSGuest

使用する必要はありません:

[button setNeedsLayout];
[button layoutIfNeeded];

代わりに、最初にタイプをDEFAULTに[〜#〜] custom [〜#〜]に設定します

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

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

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

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

[button setTitleColor:[any_color] forState:UIControlStateNormal];
1
jenish

Apple開発者ガイドでは、ボタンタイトルラベルのテキストまたは色をプロパティとして直接設定しないでください(たとえば、donotこれを行う:myButton.titleLabel.text = @ "SomeText"またはmyButton.titleLabel.textColor = [UIColor blackColor])。

むしろ、次のようなUIButtonセッター機能を使用して設定します。

    [myButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

...またはこのように:

    [myButton setTitle:@"SomeText" forState:UIControlStateNormal];.

the Apple guide を参照してください。

1
Epsilon3

多くのソリューションを試した後の結論は、setTitleの代わりにsetAttributedTitleを使用することです。

AttributedStringのタイトル文字列を作成するには:

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:@" new Test "];

[button setAttributedTitle:attString forState:UIControlStateNormal];

ところで、この問題は通常はまれにしか発生しませんが、主に次の理由で突然発生します。

  1. UIButtonの有効状態を変更し、タイトルを変更しようとした場合。

  2. 属性値を使用してからsetTitleを使用して変更する場合、属性値はその場合のタイトルよりも優れています。

  3. 別のView Controllerに移動してから戻ってボタンのタイトルを更新した場合。

1
Amr Angry

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

1)buttonUIControlStateNormal状態ではありませんでした。

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];
    });
}

回答/コメントしてくれたすべての人に感謝します!

1
neutrino

私の場合、上記のいずれも機能しませんでした(UIPopoverControllerで表示されるビューの上部にボタンがありました)。setTitleの前にRemoveFromSuperviewを削除し、addSubviewを戻す必要がありました。

0
hyouuu

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

0
Hunter

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

@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/Modern memory managementがすべてだと思います。

編集:

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

@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]];
    ...
}

...
0
Moose

代わりにyourButton.titleLabel?.text = "T"

これを使用yourButton.setTitle( "TITLE"、for:.normal)

0
Divyanshu Kumar