【Objective-C】iPadでUIAlertControllerのアラートがクラッシュする時の対処法

解決できたのでまとめ!
昨日に引き続き、iPad で UIAlertController がクラッシュする時の対処法についてです。
ActionSheet を表示する時にクラッシュする時の対処法はすぐに見つかるのですが、Alert を表示する時にクラッシュする時の対処方法についてはなかなか見つからず…苦労しました。

今回参考にさせていただいた記事はこちら。

objective c – UIAlertController disappearing since iOS 13 – Stack Overflow
https://stackoverflow.com/questions/58148334/uialertcontroller-disappearing-since-ios-13

 

さて、早速サンプルコードを記述していきます。
まず、アラートを表示したい ViewController.h に、下記を追加します。

@property (strong) UIWindow *alertWindow;

で、ViewController.m に下記のように記述します。
Alert を表示する部分のみを抜粋しています。

// UIAlertController を表示するための alertWindow の設定
self.alertWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.alertWindow.rootViewController = [[UIViewController alloc] init];
self.alertWindow.windowLevel = UIWindowLevelAlert + 1;
[self.alertWindow makeKeyAndVisible];

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert"
                               message:@"This is an alert."
                               preferredStyle:UIAlertControllerStyleAlert];
 
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
   handler:^(UIAlertAction * action) {
    // alertWindow を隠す
    [self.alertWindow setHidden:YES];
}];
 
[alert addAction:defaultAction];
[self.alertWindow.rootViewController presentViewController:alert animated:YES completion:nil];

2〜5行目で、Alert を表示する UIView の設定を行います。
で、18行目で Alert を表示する際、通常は self を使いますが、そうではなく、alertWindow に対して Alert を表示するようにしています。
Alert の表示についてはこのように行います。

最後に、Alert のボタンが押された時の処理を定義する AlertAction で、alertWindow を隠す処理を追加すればOKです。
サンプルコードで言うと 14行目になります。
なお、この alertWindow を隠す処理を追加しないと、Alert が消えなくなるのでご注意ください。
うっかり追加し忘れたときは、ページを遷移しても消えませんでした。

上記のように記述してアプリを実行したところ、問題なく Alert が表示され、クラッシュも起こりませんでした!
2日ほど悩んだ箇所だったので、解決できてよかったです!

 

以上、Objective-C で開発した iPad アプリで、UIAlertController のアラートがクラッシュする時の対処法でした。
ご参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG