【Swift】UIAlertControllerをもっと便利にするALRTを作りました

  • 41
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

UIAlertControllerをもっと便利に使えるよう、ALRTというライブラリを公開しました。
以下、ALRTを使うことで、いかにシンプルかつSwiftyUIAlertControllerを使うことができるか紹介します。

ALRTの特徴

  • 個別実装のUIAlertControllerがプロジェクトファイルに散乱するのを防ぐ
  • Alamofireのようにわかりやすく、チェーンで記述できる
  • アラート表示の成功・失敗(一部)が分かる
  • DRY。特に、よく使うOK、キャンセルアクション。
ALRT.create(.Alert, title: "タイトル", message: "メッセージ")
    .addCancel()
    .addOK()
    .show(){ result in
        switch result {
        case .Success:
            print("アラート表示成功")

        case .Failure(let error):
            print("アラート表示失敗 => \(error)")
        }
      }

利用例

1. OK、キャンセルボタン付きアラート

まず、典型的な例として、OK、キャンセルボタンを持つアラートを作成してみます。通常の実装パターンと、ALRTのそれを比べてみます。

Simulator Screen Shot Jul 31, 2016, 13.18.56.png

通常
let ok = UIAlertAction.init(title: "OK", style: .default, handler: nil)
let cancel = UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil)

let alertController = UIAlertController.init(title: "Title", message: "Message", preferredStyle: .alert)
alertController.addAction(cancel)
alertController.addAction(ok)

self.present(alertController, animated: true, completion: nil)
ALRT
ALRT.create(.Alert, title: "Title", message: "Message")
    .addCancel()
    .addOK()
    .show()

コード量が減ることはもちろん、アラートのセットアップもメソッドチェーンで書くことができ、扱いやすくなっています。

2. UITextField付きアラート

次に、UITextFieldが2つ付いたアラートを作ってみます。ログインでよくみるやつですね。

Simulator Screen Shot Jul 31, 2016, 13.19.52.png

ALRT.create(.Alert, title: "Login", message: "Please enter your credentials")
    .addTextField { textField in
        textField.placeholder = "Username"
    }
    .addTextField { textField in
        textField.placeholder = "Password"
        textField.secureTextEntry = true
    }
    .addCancel()
    .addOK() { alert, textFields in
        textFields?
            .flatMap { (placeholder: $0.placeholder ?? "No Placeholder", text: $0.text ?? "No Text") }
            .forEach { print("\($0.placeholder) => \($0.text)") }
    }
    .show()

先と同じように、チェーンで簡単に作ることができました。

ALRTでは「ログインのOKボタンをタップ後にtextField.textをバリデートする」といったユースケースに応えるため、アクションのcompletionHandlerUIAlertController.textfieldsを結びつけ、処理を宣言しておくことが可能です (addOK()のtrailing closure部分)。

例では、OKボタンが押されたらplaceholdertextprintするよう宣言しています。

もちろん、このような処理が必要ない場合、ブロックはなくても構いません。

3. アクションシートとResult

ALRTでは、当然、.ActionSheetも作成できます。
ここでは特にUIAlertControllerの表示成功、失敗にフォーカスを当ててみます。
これも他のAlert系ライブラリにはない機能かと思います。

iPadでアクションシートを作成する場合、PopoverPrensentationControllersourceViewもしくはbarButtonItemを設定しないとクラッシュが発生してしまいます。

ALRT.create(.ActionSheet, title: "Destination", message: "Please select your destination")
//     .configurePopoverPresentation { popover in
//         popover?.barButtonItem = sender
//     }
     .addAction("New York")
     .addAction("Paris")
     .addAction("London")
     .addDestructive("Not interested")
     .show(completion: { result in
         switch result {
         case .Success:
             print("The alert is displayed.")
         case .Failure(let error):
             print("The alert is not displayed. Error => \(error)")
         }
     })

UIViewControllerpresent(_:animated:completion:)は、表示の成功しかわかりませんが、ALRTでは、成功、失敗もSuccessもしくはFailureとして返し、検知可能です。

ただし、すべての失敗に対応しているわけではなく、よくある下記2つに対応しています。

  1. Popover未設定
  2. UIAlertControllerがnil
1.の出力
The alert is not displayed. Error => PopoverNotSet

ドキュメント

ドキュメントも作成しました。Xcodeプラグイン VVDocumenterを使って各メソッドのパラメータ、返り値にディスクリプションをつけた後、Cocoapodsにpushするとドキュメントページを自動生成してくれ、とても便利でした。

ALRT Reference

裏で動いているJazzyの便利さ、半端ないです。

対応環境

メイン

  • Swift 2.2
  • Xcode Version 7.3.1

ベータ

Swift 3.0のbranchを切ってあります。
* Swift 3.0
* Xcode 8 beta 5

インストール

Cocoapods

platform :ios, '8.0'

target YOUR_TARGET do
  use_frameworks!
  pod "ALRT"
end

Carthage

github "mshrwtnb/ALRT"

リンク