Help us understand the problem. What is going on with this article?

UIAlertControllerをちょっと便利にするヘルパー(.Alert限定)

More than 5 years have passed since last update.

追記(2015.07.19)

新しく記事を投稿しました「SwiftでUIAlertControllerのヘルパーライブラリを書いた」
http://qiita.com/keygx/items/e3fea65870336fe6b46c

追記(2015.07.17)

内容をパワーアップしてライブラリ化しました。
https://github.com/keygx/AlertHelperKit

 

UIAlertControllerでのアラート表示をやってくれるヘルパーです。
クリックされたボタン毎に処理を分けたい場合にも対応できます。

AlertHelper.swift
import UIKit

class AlertHelper: NSObject {

    class func showAlert (title: String?, message: String?, cancel: String?, destructive: [String]?, others: [String]?, parent: UIViewController, callback: (Int) -> ()) {

        // アラート要素が全てnilの場合は中止
        if title == nil && message == nil && cancel == nil && destructive == nil && others == nil {
            return
        }

        // アラート作成
        let alertController = UIAlertController(title: title?, message: message?, preferredStyle: .Alert)

        // キャンセルボタン処理
        if cancel != nil {
            let cancelAction = UIAlertAction(title: cancel!, style: .Cancel) {
                action in callback(0)
            }
            alertController.addAction(cancelAction)
        }

        let destructivOffset = 1
        var othersOffset = destructivOffset

        // Destructiveボタン処理
        if destructive != nil {
            for i in 0..<destructive!.count {
                let destructiveAction = UIAlertAction(title: destructive![i], style: .Destructive) {
                    action in callback(i + destructivOffset)
                }
                alertController.addAction(destructiveAction)

                ++othersOffset
            }
        }

        // その他ボタン処理
        if others != nil {
            for i in 0..<others!.count {
                let otherAction = UIAlertAction(title: others![i], style: .Default) {
                    action in callback(i + othersOffset)
                }
                alertController.addAction(otherAction)
            }
        }

        // アラート表示
        parent.presentViewController(alertController, animated: true, completion: nil)
    }
}

使い方

呼び出し側は、少々長い(引数が多いw)メソッドですが、こんな感じです。
- アラート内容にあわせて必要な項目を設定
- title、message、cancel、destructive、othersが不要な場合はnilも可
- destructive、othersは配列で複数設定が可能
- キャンセルボタンのbuttonIndexは常に0で、それ以外のボタンについては設定順に1〜を返却

下記にいくつかの例を挙げます。

サンプル1

まずは定番の[キャンセル][OK]パターン。

screen1.png

AlertHelper.showAlert("アラート", message: "メッセージ", cancel: "キャンセル", destructive: nil, others: ["OK"], parent: self) {
    (buttonIndex: Int) in
    // 押されたボタンのインデックスにて処理を振り分ける
    switch buttonIndex {
        case 1 :
            // OK
            println("\(buttonIndex)")
            break
        default :
            // キャンセル
            println("\(buttonIndex)")
            break
    }
}

サンプル2

Destructiveスタイルの場合は下記の通り。

screen2.png

AlertHelper.showAlert("アラート", message: "メッセージ", cancel: "キャンセル", destructive: ["反対"], others: ["賛成"], parent: self) {
    (buttonIndex: Int) in
    // 押されたボタンのインデックスにて処理を振り分ける
    switch buttonIndex {
        case 1 :
            // 反対
            println("\(buttonIndex)")
            break
        case 2 :
            // 賛成
            println("\(buttonIndex)")
            break
        default :
            // キャンセル
            println("\(buttonIndex)")
            break
    }
}

サンプル3

ボタンタイトルは配列で増やせます。それに合わせて受取側も増やします。

screen3.png

AlertHelper.showAlert("アラート", message: "メッセージ", cancel: "キャンセル", destructive: nil, others: ["選択肢1", "選択肢2", "選択肢3"], parent: self) {
    (buttonIndex: Int) in
    // 押されたボタンのインデックスにて処理を振り分ける
    switch buttonIndex {
        case 1 :
            // 選択肢1
            println("\(buttonIndex)")
            break
        case 2 :
            // 選択肢2
            println("\(buttonIndex)")
            break
        case 3 :
            // 選択肢3
            println("\(buttonIndex)")
            break
        default :
            // キャンセル
            println("\(buttonIndex)")
            break
    }
}

サンプル4

ユーザーに確認を促すような、閉じるだけの場合です。

screen4.png

AlertHelper.showAlert(nil, message: "メッセージ", cancel: "確認", destructive: nil, others: nil, parent: self) {
    (buttonIndex: Int) in
    // ボタンを押されてもなにもしない
}
keygx
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away