【Swift】UIAlertViewからUIAlertControllerへマイグレーションするときのちょっとした小ネタ

昔作ったアプリ(My OC Diary等)の対応バージョンをiOS9以上にあげると、UIAlertViewが非推奨になったからUIAlertControllerを使ってね的なアラートが出ます。そうなると、書き換えたくなっちゃうのがエンジニアの性なのですが、その時に、これどうしたら良いんだろう的なちょっとした小ネタをご紹介します

非推奨のワーニング

UIAlertViewを使っているアプリの対応バージョンをiOS9以上に上げると、以下のようなワーニングが表示されます。ウザいですよね。UIAlertViewからUIAlertControllerへの書き換え方は色々なサイトにサンプルがあるので、今回は割愛します

'UIAlertView' is deprecated: first deprecated in iOS 9.0 - UIAlertView is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead

 

小ネタ1(UIAlertControllerにtagを付けたい)

1つのUIViewControllerで複数のUIAlertViewを表示するようなパターンがあった場合に、UIViewControllerをUIAlertViewDelegateにしてしまうと、どのUIAlertViewのデリゲートメソッドも同じメソッドが呼ばれてしまいます(それが間違っていると言われたらおしまいですが・・・)。そんな時にUIAlertViewにtagを設定し、デリゲートメソッド内ではそれで条件分岐をしたり出来ました。UIAlertControllerに書き換える際に同様にtagを設定しようとすると、そもそもUIAlertControllerにはtagの属性を持ってません(UIAlertControllerのコールバックはデリゲートではないので、tagなどいらんと言われたらそれまでですが・・・)。と、言うことで以下で代替することが出来ます

// UIAlertControllerのviewがtag属性を持っているので、そこに設定することが出来ます
alertController.view.tag = 99

 

小ネタ2(dismissWithClickedButtonIndexが使えない)

プログラムでアラートを消したいときとかあると思います。UIAlertViewではdismissWithClickedButtonIndex:animatedを使って閉じることが出来ました。UIViewControllerではその関数は存在しないので、通常のViewControllerを閉じるときと同じことをします。以下、サンプルです

alertController.dismiss(animated: true) {
    // 閉じた時に何かロジックを走らせたい場合は、この中にロジックを書きます
}

 

参考サイト

UIAlertController how add the tag value in obj c
iOS8でUIAlertViewからUIAlertControllerへ置き換えるのは大変だ

関連記事

【Swift4】「'characters' is deprecated」というワ...

【Ubuntu】Ubuntu18.04LTSにアップグレードしてやったことメモ

【GraalVM】ちょっと弄ってみた

Swift4におけるsubstringについて

【Objective-C】Implementing deprecated met...

【Swift4】Stringイニシャライズ時のエラー