[iOS] PSTAlertController を使って UIAlertController / UIAlertView を共通化する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

UIAlertController は iOS 8 からしか使えない

iOS 8 から UIAlertController が追加され、UIAlertView は Deprecated になりました。しかし UIAlertController は iOS 8 からしか使えません。iOS 7 をサポートするにはやはり UIAlertView を使う必要があります。

ここで思いつくのが UIAlertController と UIAlertView を共存して使うというアイデアですが、いかんせん面倒です。

そんな処理はライブラリ (OSS) にお任せしたい!ところです。そのような機能を提供するライブラリは GitHub で割と出回っているのですが、独自 View で実装されていたり、余計な処理が入っていたりと、信頼のおけるライブラリはあまり多くありません。

そこで今回は PSTAlertController をご紹介します。このライブラリは比較的シンプル、きれいに書かれており、インターフェースも使いやすい印象を受けました。オススメです!

インポート

CocoaPods を使用している場合は、以下のようにインポートしましょう。

pod 'PSTAlertController'

実装

実装は UIAlertController とほぼ同じ感じで実装できます。異なる点は、表示するメソッドは PSTAlertController が担う、という点です。

#import "ViewController.h"
#import <PSTAlertController/PSTAlertController.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    
    PSTAlertAction *okAction = [PSTAlertAction actionWithTitle:@"OK"
                                                       handler:^(PSTAlertAction *action) {
                                                           NSLog(@"OKが押されたよー");
                                                       }];
    PSTAlertAction *cancelAction = [PSTAlertAction actionWithTitle:@"キャンセル"
                                                             style:PSTAlertActionStyleCancel
                                                           handler:^(PSTAlertAction *action) {
                                                               NSLog(@"キャンセルが押されたよー");
                                                           }];
    PSTAlertController *alertController = [PSTAlertController alertWithTitle:@"アラートだよー"
                                                                     message:@"メッセージだよー"];
    [alertController addAction:okAction];
    [alertController addAction:cancelAction];
    [alertController showWithSender:self controller:self animated:YES completion:nil];
}

@end

実行するとアラートが表示されます。iOS 8 で実行すると UIAlertController が使われ、iOS 7 では UIAlertView が使われます。見た目上では違いはありません。ちなみに UIActionSheet にも対応しています。

pst-alert-controller-ios8

なお、showWithSender:controller:animated:completion: の第二引数の controller を渡さない場合、内部では次のような処理が行われているため rootViewController から Present されます。

        // As a convenience, allow automatic root view controller fetching if we show an alert.
        if (self.preferredStyle == PSTAlertControllerStyleAlert) {
            if (!controller) {
                // sharedApplication is unavailable for extensions, but required for things like preferredContentSizeCategory.
                UIApplication *sharedApplication = [UIApplication performSelector:NSSelectorFromString(PROPERTY(sharedApplication))];
                controller = sharedApplication.keyWindow.rootViewController;
            }

            // Use the frontmost viewController for presentation.
            while (controller.presentedViewController) {
                controller = controller.presentedViewController;
            }

            if (!controller) {
                NSLog(@"Can't show alert because there is no root view controller.");
                return;
            }
        }

まとめ

この手のライブラリは流行りはありますが、PSTAlertController は UIAlertController と UIAlertView を共通化する機能を実現するための最小限の実装になっているので、好印象なライブラリでした。ぜひ使ってみてください。