3

iOS 5.1 をターゲットにしており、ストーリーボードを使用しています。UITableViewCell 内に UIButton があり、タップすると「Touch Up Inside」メソッドを呼び出し、Web サービスを呼び出し、完了ハンドラー内で、すべてのボタン状態のテキストを設定する関数の呼び出しで UIButton のテキストを更新しますそのようです:

+(void) setButtonText:(NSString *)text forButton:(UIButton *)button
{
    [button setTitle:text forState:UIControlStateNormal];
    [button setTitle:text forState:UIControlStateDisabled];
    [button setTitle:text forState:UIControlStateHighlighted];
    [button setTitle:text forState:UIControlStateSelected];
}

ボタンをタップするだけでもうまく機能しますが、ボタンを長押しして放すと、Web サービスの呼び出しと完了ハンドラーが呼び出されてすぐに戻りますが、ボタンのテキストが更新されるまでに約 5 秒かかります。ボタンとself.viewの両方でsetNeedsDisplayを呼び出してみました。誰かが長いプレス+リリースを行ったときに、テキストをすぐに更新する方法はありますか?

4

2 に答える 2

1

問題が見つかりました。UI スレッドとは別のスレッドを実行する completionHandler 内でボタン テキストを設定していました。したがって、5 秒の遅延の奇妙な未定義の動作です。修正は電話することです...

[self performSelectorOnMainThread:@selector(receivedData:) withObject:result waitUntilDone:YES];

...次に、setButtonText への呼び出しを「receivedData」メソッドに入れます。

UI で何かを更新するときの黄金律は、UI スレッドで更新することです。

明らかに、質問にさらにコードを投稿していたら、これが表示されていたでしょう。申し訳ありません。少なくとも学んだ教訓。

于 2012-12-19T17:47:28.173 に答える
1

必ずしも長押しを検出する必要はありません。ボタンによってセレクターが起動される状態を変更するだけです。これをプログラムで行っている場合は、次のようにする必要があります。

[self.myButton addTarget:self action:@selector(mySelector) forControlEvents:UIControlEventTouchDown];

XIB/ストーリーボードでは、オプションは「タッチダウン」の下のパレットで使用できます。

ここに画像の説明を入力

UIControlEventTouchUpInsideこれにより、ボタンの近くでタッチが終了したときにイベントが送信される に設定されていると仮定できるのではなく、ボタンにタッチするとすぐにセレクターが起動されます。

于 2012-12-19T16:21:46.793 に答える