iOSのアプリを作成している時に、アラート表示をするためにUIAlertControllerを使う事で、結構簡単にアラート表示が実現できます。
ですが、作ってるうちに気付かずエラーの原因となる書き方というか、エラーになる事を考慮せずに書いてしまって、落ちる・・・という事があったので、自分への戒めのためにもメモ_φ(・_・
自分が気付かずUIAlertControllerでエラーを起こす原因
- メインスレッドで呼び出さない
- 2重でアラートを表示
メインスレッドで呼び出さない
ボタンをタップして、そのView内で表示であればメインスレッドで実行され、アラートが表示されると思いますが、通知やユーザーのUI操作によって引き起こされたものではないアラート表示に関しては、メインスレッドで呼び出されない可能性があります。
これを考慮せずにアラート表示を実行すると、メインスレッドで実行しろ!という風に怒られてエラーが発生してしまいます。
UIの変更はメインスレッドで行わないといけないっていう基本的な事なんですが、複雑になってくると考慮できてなかったりします・・・
2重でアラートを表示
これは、既にアラートを実行して表示しているのに、再度同じアラートを表示しようとするとエラーになります。
こちらもボタンをタップしてアラート表示などであれば、2重で重複してアラート表示される事もないと思うので、起きないエラーです。
「メインスレッドで呼び出されない」に書いたような、通知やユーザーのUI操作によって引き起こされたものではないアラート表示の場合、同じアラートが2重で表示される可能性があります。
こちらも考慮せずにアラート表示を実行するとエラーが発生してしまいます。
アラートが既に表示されているか調べる方法
if let currentAlertView = self.presentedViewController as? UIAlertController {
// 既に表示されている
} else {
self.present(alert, animated: true)
}
※上記のselfはUIViewControllerです
このように既にアラートが表示されているかどうかを確認できます。
2重で表示されてしまう可能性があるコードを書いている場合、このように回避策を考慮しないといけない・・・
という教訓でした(´ε`;)
コメント