【iOS8】UIAlertControllerで文字がなぜか太くなる?

メモ書き程度に。

UIAlertViewはiOS8でもとりあえず動いているようですが、deprecatedになったためいずれ痛い目にあわないよう、バージョンで分岐してiOS8未満でなければUIAlertController使うように対応しました。

で、対応後の不具合報告に「文字が太くなってる」みたいなものがあがってきてなんのことやらで調べてみた。

結論からいうと、"title"にnilを渡すと"message"に指定したものがtitleとして表示されてしまうという現象によるものだった。

以下キャプチャとコード。

titleにnilを指定したとき

f:id:ushisantoasobu:20140920181111j:plain

UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil
                                                               message:@"message"
                                                        preferredStyle:UIAlertControllerStyleAlert];

[alert addAction:[UIAlertAction actionWithTitle:@"close"
                                         style:UIAlertActionStyleCancel
                                        handler:nil]];

[self presentViewController:alert animated:YES completion:nil];

titleに@""を指定したとき

で、解決策はtitleに@""を渡してあげれば正しく表示されるっぽい。

f:id:ushisantoasobu:20140920181122j:plain

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@""
                                                               message:@"message"
                                                        preferredStyle:UIAlertControllerStyleAlert];

[alert addAction:[UIAlertAction actionWithTitle:@"close"
                                         style:UIAlertActionStyleCancel
                                        handler:nil]];

[self presentViewController:alert animated:YES completion:nil];

とりあえずこの問題はOKそう。


あとUIAlertViewはクラスメソッドで表示していたから良かったけど、UIAlertControllerの引数に指定しなくちゃいけないので、UIViewControllerを継承していないユーティリティクラスだったりマネージャクラスから呼び出すときにはどうするのがいいのかがわかっていない・・・。

とりあえず以下のようなコードで最上位のUIViewControllerを取得して・・・みたいなことしてるけど、

UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
while (topController.presentedViewController) {
    topController = topController.presentedViewController;
}

キーボードが表示されているときにはクラッシュしたしダメなんだろうなぁ。これってどうするのがベストプラクティスなんだろう。(設計思想を把握できていない)