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


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

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

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

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


##使い方

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

```Swift:
import AlertHelperKit
```


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


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

```Swift:
AlertHelperKit().showAlert(self, title: "Alert", message: "Message", button: "OK")
```
![Alert.png](https://qiita-image-store.s3.amazonaws.com/0/15905/796a9299-4419-e5d5-4cf2-31ee44a89742.png "Alert.png")


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

```Swift:
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](https://qiita-image-store.s3.amazonaws.com/0/15905/7bc489ef-3ca0-ae30-4206-eac782d760d7.png "AlertWithHandler.png")


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

```Swift:
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](https://qiita-image-store.s3.amazonaws.com/0/15905/21b772b7-803d-f709-6dd2-a24c41a17a64.png "AlertWithTextFields.png")


###・アクションシート例1
iPadでの表示にも対応しています。

```Swift:
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](https://qiita-image-store.s3.amazonaws.com/0/15905/5db88dcf-1361-752a-97c1-040575618c3d.png "ActionSheet.png")　![ActionSheet_iPad.png](https://qiita-image-store.s3.amazonaws.com/0/15905/fed67556-06a1-3a90-9bad-3589df63eee3.png "ActionSheet_iPad.png")


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

```Swift:
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](https://qiita-image-store.s3.amazonaws.com/0/15905/b4731514-10f0-03ed-7110-076584f81b76.png "Menu.png")　![Menu_iPad.png](https://qiita-image-store.s3.amazonaws.com/0/15905/811c5f8e-c7be-c151-1f00-c28df149134c.png "Menu_iPad.png")


---

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

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