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

今まで遭遇したことがなかったエラーなので、未だ奮闘中です。
Objective-C で開発中の iPad アプリを実行したところ、UIAlertController を表示するタイミングでクラッシュするバグの対処方法についてです。
実は発見した参考サイトは私の状況とはマッチしていないので、解決には至っていないのですが、これも今後使いそうなので、備忘録としてまとめ。

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

UIAlertControllerをiPadで使用する際の注意点 – Qiita
https://qiita.com/ShingoFukuyama/items/c3c83c552292dcb49457

 

さて、対処法ですが、まず前提として、スタイルに UIAlertControllerStyleActionSheet が指定されている必要があります。
で、この状況でタイトルやボタンなどを設定後、iPad で実行するとクラッシュします。
原因は UIAlertControllerpopoverPresentationController プロパティを指定していないことなので、これらを指定します。
サンプルコードは下記の通りです。

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"タイトル"
                                                                         message:@"メッセージ"
                                                                  preferredStyle:UIAlertControllerStyleActionSheet];

[alertController addAction:[UIAlertAction actionWithTitle:@"ボタン" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    // ボタンをタップした時の処理
}]];

// iPad で実行する時に必要な設定
alertController.popoverPresentationController.sourceView = self.view;
alertController.popoverPresentationController.sourceRect = CGRectMake(100.0, 100.0, 20.0, 20.0);

[self presentViewController:alertController animated:YES completion:^{}];

なお、追加する必要があるのが 10、11行目popoverPresentationController プロパティの指定です。
この2行を指定して実行すると、iPad でもクラッシュすることなく UIAlertController を表示することができました!
ただ、サンプルコードのままだと、アラートが表示される位置が画面の左上になってしまうので、こちらはアプリのレイアウトに合わせて適宜調整してください。

こんな感じで、アラートのスタイルに ActionSheet を利用している場合は、こちらの対処方法が使えます。
が、私が表示したいのは通常のアラートでして…。
ダメ元で上記の popoverPresentationController プロパティの指定を追加してみましたが、やっぱりダメでした。
ということで、他の心当たりもあたってみたいと思います。
もしわかったら、また記事にまとめます。

 

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

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

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

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

CTR IMG