Edited at

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

More than 3 years have passed since last update.

以前、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の使い方で思いついたパターンは網羅できたつもりですが、こんな使い方できないよー等、ご要望がございましたらお寄せください。

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