どういう経緯?
Alertを表示したいプログラムがあったのですが
1・その度にUIAlertControllerを作成するのがいかがなものか?
2.作成する部分をなるべく共通ロジックに移動したい
3.でも共通ロジックにクロージャを渡すのは見苦しくないか?
ということでなんか言語の方針とは違うと思いますがDelegateで処理するようにしました。
(注意)動作検証はしてません
共通ロジック
Common.Swift
protocol AlertDelegate{
func alertClose(alertReturn: Alert.AlertReturn)
}
class Alert{
enum AlertReturn{
case Nothing
case Cancel
case Value1
case Value2
case Value3
}
struct AlertDefault{
var title:String = ""
var alertReturn:AlertReturn? = nil
}
init(){
}
var delegate:AlertDelegate!
var isHaveCancel:Bool = true;
var isAlertSheet:Bool = false;
var title:String = "";
var message:String = "";
var preferredStyle:UIAlertControllerStyle = UIAlertControllerStyle.Alert
var defaultVal1:AlertDefault? = nil
var defaultVal2:AlertDefault? = nil
var defaultVal3:AlertDefault? = nil
func showAlertController(view:UIViewController){
var alert:UIAlertController = UIAlertController(title:title,
message: message,
preferredStyle: preferredStyle)
if(isHaveCancel){
let cancelAction:UIAlertAction = UIAlertAction(title: "キャンセル",
style: UIAlertActionStyle.Cancel,
handler:{
(action:UIAlertAction!) -> Void in
println("Cancel common")
self.delegate.alertClose(AlertReturn.Cancel)
})
alert.addAction(cancelAction)
}
func addDefault(title:String,alertReturn:AlertReturn){
let defaultAction:UIAlertAction = UIAlertAction(title: title,
style: UIAlertActionStyle.Default,
handler:{
(action:UIAlertAction!) -> Void in
self.delegate.alertClose(alertReturn)
})
alert.addAction(defaultAction)
}
if(defaultVal1 != nil){
addDefault(defaultVal1!.title, defaultVal1!.alertReturn!)
}
if(defaultVal2 != nil){
addDefault(defaultVal2!.title, defaultVal2!.alertReturn!)
}
if(defaultVal3 != nil){
addDefault(defaultVal3!.title, defaultVal3!.alertReturn!)
}
view.presentViewController(alert, animated: true, completion: nil)
}
}
使うクラス
・AlertDelegateを実装
UserAlert.swift
class CameraViewController: UIViewController,AlertDelegate {
func alertClose(alertReturn: Alert.AlertReturn) {
switch alertReturn{
case .Cancel:
break
case .Value1:
println("1")
break
case .Value2:
println("2")
break;
case .Value3:
println("3")
break;
default:
break;
}
}
}
・呼び出し時
UserAlert.swift
var alert = Alert()
alert.title = "アラート"
alert.message = "アラートです"
alert.delegate = self
alert.defaultVal1 = Alert.AlertDefault(title: "OK", alertReturn: Alert.AlertReturn.Value1)
alert.showAlertController(self)
とりあえずいろいろ試しながら修正していきたいと思います。
問題点
・複数回同じ画面からAlertを利用する場合にうまいことDelegateの処理が書き分けられない。
・そもそも分かりづらい。