2015-09-07 11 views
14

UIAlertViewsをUIAlertControllersに変更しようとしています。遅延後に実行されるUIAlertActionハンドラ

UIAlertAction *undoStopAction = [UIAlertAction actionWithTitle:@"Undo Stop" 
                 style:UIAlertActionStyleDefault 
                 handler:^(UIAlertAction *action) { 
                  [self undoStop]; 
                 }]; 

ただし、アクションがタップされてから約1秒後にハンドラは実行されません。これをスピードアップする方法はありますか?

+1

メインスレッドで何かしていますか? – Larme

+1

または、メインスレッドを使用してアラートを表示していない場合は、バックグラウンドメソッド/ブロック – soulshined

+0

内で実行していますか? –

答えて

3

アラートビューでは短い遅延があります(1秒未満ですが)。これが便利でない場合は、ラベルとボタン(基本的にカスタマイズされたアラートビュー)で画面をカバーするビューをプログラムで作成することができます。

+0

ありがとう。私はこれまで、UIAlertViewとしてアートボタンをタップしたときに特定の動作をしていました。それはいつも瞬間だった。私はそれが非難されているにもかかわらず、今のところそれを続けていると思います。 –

0

Tさんが残したコメントで暗示されているように、ハンドラがメインスレッドで呼び出されていない可能性があります。遅延が説明できます。

dispatch_async(dispatch_get_main_queue()) { 
<your code> 
} 

にハンドラーコードを埋め込み、まだ遅延が発生していないかどうかを確認してください。

+0

変更なしハンドラが1秒後まで実行されていないようです。 UIAlertViewを使ったときとは違って –

0

半ソリューションがここにあります:

The handler of a UIAlertAction is a bit too late - how can I make it immediate?

基本的には、警告コントローラをサブクラス化しviewWillDisappearのハンドラを実行します。アラートコントローラにハンドラブロックを格納することができます。

このソリューションの問題点は、UIAlertActionでアクションを追加した場合のように、ボタンごとにハンドラを実行できないことです。それは大きな制限です。

しかし、このソリューションは私のために働いていました(アラートが表示されたときにアラートの背後にバックグラウンドビューを追加しようとしていたため、アラートが消えたときにアラートが表示されました...)ボタンのタップが、ハンドラが遅れているために動作しませんでした)。

関連する問題