LoginSignup
9
9

More than 5 years have passed since last update.

SwiftでUIAlertControllerのヘルパーライブラリを書いた

Last updated at Posted at 2015-07-19

以前、UIAlertControllerをちょっと便利にするヘルパー(.Alert限定) という記事を投稿したのですが、ちゃんとライブラリ化しないと使いにくいよね ってことで、内容を見直しつつ(今回はActionSheetにも対応!)ライブラリ化しました。

Github: keygx/AlertHelperKit
https://github.com/keygx/AlertHelperKit

概要

できるだけシンプルなインターフェイスにしたくて(以前書いたヘルパーは引数が多くてイケてなかったので)色々考えた結果、 設定に関する情報はプロパティ経由で渡すことにしました。 ※設定値は構造体で渡す形式に変更しました。(下記サンプルコードは書き換え済み)

結果、メソッドはシンプルに、プロパティも必要なものだけ設定すればよくなって、とてもスッキリした見た目になったかなと思います。

使い方

まずはお約束の import 文です。

import AlertHelperKit
※以降は各種使い方のサンプルとなります。

・アラート例1

一番シンプルで一番多いパターン(閉じるボタンのみのアラート)はワンライナーで書きたいので、専用のメソッドを用意しました。

AlertHelperKit().showAlert(self, title: "Alert", message: "Message", button: "OK")

Alert.png

・アラート例2

ボタンが2つ以上になって、ボタン押下のコールバックを受け取るタイプです。

let params = Parameters(
    title: "Alert",
    message: "Message",
    cancelButton: "Cancel",
    otherButtons: ["OK"]
)

AlertHelperKit().showAlertWithHandler(self, parameters: params) { buttonIndex in
    switch buttonIndex {
    case 0:
        println("Cancel: \(buttonIndex)")
    default:
        println("OK: \(buttonIndex)")
    }
}

Alert/ActionSheetは、どのボタンが押下されたかが分かれば良いと思っているので、受け取るのはボタンのIndexのみとしています。
なお、キャンセルボタンは常に0になります。

AlertWithHandler.png

・アラート例3

TextField付きのアラートです。
placeholderおよびパスワード入力時のマスク設定も可能です。

let params = Parameters(
    title: "Alert",
    message: "Message",
    cancelButton: "Cancel",
    otherButtons: ["OK"],
    inputFields: [InputField(placeholder: "username", secure: false),
                  InputField(placeholder: "password", secure: true)]
)

var alert = AlertHelperKit()
alert.showAlertWithHandler(self, parameters: params) { buttonIndex in
    switch buttonIndex {
    case 0:
        println("Cancel: \(buttonIndex)")
    default:
        println("OK: \(buttonIndex)")

        if let textFields = alert.textFields {
            // username
            let name: UITextField = textFields[0] as! UITextField
            if count(name.text) > 0 {
                println(name.text)
            }
            // password
            let pass: UITextField = textFields[1] as! UITextField
            if count(pass.text) > 0 {
                println(pass.text)
            }
        }
    }
}

入力されたテキストはサンプルの様にして受け取ります。

AlertWithTextFields.png

・アクションシート例1

iPadでの表示にも対応しています。

let params = Parameters(
    cancelButton: "Cancel",
    destructiveButtons: ["Action1"],
    otherButtons: ["Action2", "Action3", "Action4"],
    sender: sender,
    arrowDirection: .Up
)

AlertHelperKit().showActionSheet(self, parameters: params) { buttonIndex in
    switch buttonIndex {
    case 0:
        println("Cancel: \(buttonIndex)")
    default:
        println("Action: \(buttonIndex)")
    }
}

ActionSheet.png ActionSheet_iPad.png

・アクションシート例2

状況によってボタンをDisabledにしたい場合にも対応しています。
グレーアウトしたいボタンを disabledButtons に指定して呼び出します。

let params = Parameters(
    cancelButton: "Cancel",
    otherButtons: ["Menu1", "Menu2", "Menu3", "Menu4", "Menu5"],
    disabledButtons: ["Menu1", "Menu4"],
    sender: sender,
    arrowDirection: .Down,
    popoverStyle: .BarButton
)

AlertHelperKit().showActionSheet(self, parameters: params) { buttonIndex in
    switch buttonIndex {
    case 0:
        println("Cancel: \(buttonIndex)")
    default:
        println("Menu: \(buttonIndex)")
    }
}

また、iPad表示時のBarButtonからの表示にも対応しています。

Menu.png Menu_iPad.png


AlertとActionSheetの使い方で思いついたパターンは網羅できたつもりですが、こんな使い方できないよー等、ご要望がございましたらお寄せください。

できるだけ対応していきたいと思います。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9