2017-12-13 12 views
1

警告コントローラの呼び出しをあまりにも早く終了すると、警告メッセージが表示されなくなります。たとえば、アラートコントローラを表示して直ちに棄却しようとすると、その拒否は無視されます。たとえば、UIAlertControllerをあまりにも早く終了しようとすると、警告が却下されない

// Done in viewDidLoad 
let alertController = UIAlertController(title: nil, message: "Connecting to Bubble Centerpiece...\n\n", preferredStyle: .alert) 
present(alertController, animated: true, completion: nil) 
alertController.dismiss(animated: true, completion: nil) 

このコードでは、AlertControllerは破棄されません。私のケースでは、私の解任は、警報コントローラが提示されてから約0.5秒後に通常呼び出され、解雇されませんでした。私は手動でこれを動作させるためにこのような拒否コードを遅延させなければならなかった。

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: { self.alertController.dismiss(animated: true, completion: nil)}) 

私の仮定は棄却コールがアラートよりも早く到着した場合、警告コントローラが適切に設定することに時間がかかり、ということであるが、実際に表示され、それが却下されることはありません。私はDispatchQueueでそれを遅らせるのではなく、より洗練された解決方法があるのだろうかと思いました。

+0

をあなたが提示し、すぐにアラートを却下するためにどのような理由がありますか?可能な解決策の1つは、独自のUIAlertControllerを作成して、viewDidLoadメソッドで自身を終了させることです。 – milesper

+0

完了ブロックで却下しようとすることができます – ClemensL

+0

アクティビティに入ると警告が表示され、Bluetooth接続が確立されたという通知を受け取るまでアクティブのままです。ブルートゥース通信を確立するには、時には0.5秒から4秒の間が必要です。これは、時折、切断呼び出しが速く行われる理由です。 – Saik

答えて

3

animated: trueを渡す限り、アラートコントローラはアニメーション化が完了するまで階層化されないため、それまでは警告コントローラを却下することはできません。これは正確にcompletionブロックが使用されているものです(一般的には、何か良いAPIが発生すると、は非同期でに完了ブロックが表示されます)。あなたは行って、(私は、これは貴重な現実のユースケースであると想像していないが)提示した直後に解雇することができます

present(alertController, animated: true, completion: { 
    alertController.dismiss(animated: true, completion: nil) 
}) 
関連する問題