解決できたのでまとめ!
昨日に引き続き、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 のアラートがクラッシュする時の対処法でした。
ご参考になれば幸いです。