こんにちは、daihaseです。
今日はiOS(Swift)でアプリを作る際はほぼ確実に実装するであろうUIAlertControllerについて。皆さんご存知のように、iOS8からはUIAlertViewが非推奨になってUIAlertControllerが登場してきましたね。
今回はそんなUIAlertControllerを使った簡単なユーティリティクラスの紹介。
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ライフを〜