2016-05-11 12 views
3

iOS 8の後、実装をUIAlertViewの代わりにUIAlertControllerに変更すると、頭がおかしくなります。UIAlertController dismiss is slow

ボタンをクリックした後にUIが応答するまで、解雇には1秒程度の時間がかかります。これはユーザーが何か間違っていると思うことを意味します。

私はこれに苦しんでいる唯一の人ですか?これはいくつかのアプリにまたがっており、これほど簡単な実装では本当です。私はこれを新しい空のプロジェクトで試しました。

- (IBAction)showAlertView { 

    [[[UIAlertView alloc] initWithTitle:@"test" message:@"test" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] show]; 
} 

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 

    NSLog(@"this is fast"); 
} 

-(IBAction)showAlert { 

    UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"test" message:@"test" preferredStyle:UIAlertControllerStyleAlert]; 

    [controller addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 

     NSLog(@"this is slow"); 

    }]]; 

    [self presentViewController:controller animated:NO completion:nil]; 

} 

ボタンをクリックすると、何かがコンソールに出力されるまでに約1秒間の遅延が生じます。アラートの発表はまったく遅れていません。

編集:タイミングが近ければ、それはおそらく700msとよく似ていますので、完全な秒はありませんが、瞬間的なものには長すぎます。

+0

UIからの応答が遅いのは、多くの場合、バックグラウンドスレッドでUIタスクを実行することによって発生します。非同期補完ハンドラからこのアラートを表示していますか? UIAlertControllerには一般的な問題はありません。 – Paulw11

+0

これはそのままのコードです。明示的なスレッドでは何も実行されません。上記のコードをIBActionにバインドして、コントローラを表示するためのボタンをクリックすると、まだ遅くなります。すべてのアプリで使用するたびにこのようになっています。私は非常に混乱しています。 – nickdnk

+0

これは、View Controllerをアニメーション化したとき(例:垂直をカバーする)とほぼ同じように、解雇を待つようです。解雇のアニメーションがなければ、私はここで話しているのと同じ遅延を得る。 – nickdnk

答えて

3

私はそれは古い質問です知っているが、私は同じ問題を抱えていたとUIAlertControllerを提示するのViewControllerでこれを追加する私のためにそれを解く:

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

スウィフトバージョン:悲しいこと

override func canBecomeFirstResponder() -> Bool { 
    return true 
} 
+0

違いはありません。 – nickdnk

+0

それから間違ったことがあります。ここでは、canBecomeFirstResponderをオーバーライドした後に遅延がなくなったきれいなプロジェクトがあります。 [link](https://www.dropbox.com/s/n56d44nozjecjzx/AlertControllerTest.zip?dl=0) これにはswiftとobj-cのバージョンがあり、iOS 8と9の両方で動作します。あなたは実験を行い、返り値をNO/FALSEに変更すると、0.7秒の遅延が戻っていることに気付くでしょう。 – nihilvex

+0

私のために働く。私はこの振る舞いの根底にあるメカニズムが何であるのだろうか。 – JonSlowCN

1

を、オーバーライドcanBecomeFirstResponderは私たちを助けませんでした。

アラートを表示する前に、ビューコントローラの可能な対応者にresignFirstResponderと連絡すると、私たちは助けになりました。

何らかの理由で、テキストフィールドが最初のレスポンダだった場合、次のレスポンダを探すビュー階層を通過しようとするように見えます。テキストフィールドにフォーカスがない場合、遅延は消えた。

+0

これは今は古い問題だと知っていますが、私は同じことを経験しています。私たちはiOS 7/8のサポートを中止し、 'UIAlertView'で廃止予定の警告を受け取ります。 'UIAlertViewController'に変換すると、アクションをクリックした後もほぼ同じ秒の遅延が観測されます。アクションハンドラは、単に十分に速く呼び出されることはありません。私は、私が知る限り、このビューではテキストフィールドやオブジェクトはfirstResponderではありません。全く新しいプロジェクト(textviewsなし).. – Sti