Libra Studio Log

開発に関することやゲーム、ガジェットなどについてつらつらと書き記しています

UIAlertControllerでアラートを出す簡単なサンプル

f:id:daihase:20190809100049p:plain

こんにちは、daihaseです。

今日はiOS(Swift)でアプリを作る際はほぼ確実に実装するであろうUIAlertControllerについて。皆さんご存知のように、iOS8からはUIAlertViewが非推奨になってUIAlertControllerが登場してきましたね。

今回はそんなUIAlertControllerを使った簡単なユーティリティクラスの紹介。

github.com

iOS_SampleリポジトリのUIAlertControllerSampleという簡単なサンプルプロジェクトを作って上げてみたので是非使ってみてください。

使い方は非常に簡単。 ダイアログを表示したい場所で以下のように呼び出すだけ。

それではコードを書いてみます。

let alertTitle = "Title"
 let alertMessage = "message1\nmessage2"
 let positiveButtonText = "OK"
 let negativeButtonText = "Cancel"

 Util.sharedInstance.showAlertView(title: self.alertTitle , message: self.alertMessage, actionTitles: [self.negativeButtonText, self.positiveButtonText], actions: [
            {()->() in
            print(self.negativeButtonText)
            }, 
                       {()->() in
            print(self.positiveButtonText)
            }]
        )

 

Util.swift (参考までにこっちはUtilとしてUIAlertControllerをまとめたもの)

import UIKit

class Util: NSObject {
    
    var rootWindow: UIWindow!
    
    // Singleton.
    class var sharedInstance: Util {
        struct Static {
            static let instance: Util = Util()
        }
        return Static.instance
    }
    
    private override init() {}
    
    // show alert.
    func showAlertView(
        title: String? = nil,
        message: String,
        actionTitles: [String],
        actions: [() -> ()]?) {
        // create new window.
        let window = UIWindow(frame: UIScreen.main.bounds)
        window.backgroundColor = UIColor.clear
        window.rootViewController = UIViewController()
        Util.sharedInstance.rootWindow = UIApplication.shared.windows[0]
        //create alertview.
        let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
        for title in actionTitles {
            //add action.
            let action = UIAlertAction(title: title, style: .default, handler: { (action : UIAlertAction) -> Void in
                if let acts = actions {
                    if acts.count >= actionTitles.count {
                        acts[actionTitles.index(of: title)!]()
                    }
                }
                DispatchQueue.main.async(execute: { () -> Void in
                    alert.dismiss(animated: true, completion: nil)
                    window.isHidden = true
                    window.removeFromSuperview()
                    Util.sharedInstance.rootWindow.makeKeyAndVisible()
                })
            })
            alert.addAction(action)
        }
        
        window.windowLevel = UIWindowLevelAlert
        window.makeKeyAndVisible()
        window.rootViewController?.present(alert, animated: true, completion: nil)
    }
}

 

詳しい使い方としては、Utilクラスのインスタンスはシングルトンで取得、あとはメソッドとして定義してるshowAlertViewを呼び出してやるだけです。引数にはタイトル、メッセージ本文、Cancelにあたるボタン、OKにあたるボタン、それぞれ文字列を指定してやる感じですね。

ちなみに引数のactionsはクロージャーをセットできる配列になってますので、OKを押した後に通信処理を〜、みたいなことも簡単に出来ます。

OK1つだけのダイアログだったらactionsに"OK"の文字列を1個だけ指定してやる感じですね。

これまた初心者向けな内容になりましたが、アプリ作り始めの方やSwift勉強中の方々の少しでもお役に立てれば。

 

ではでは良いSwiftライフを〜