【Swift】UIAlertControllerのActionをクロージャで処理したくない
同じクラスから複数回呼び出す場合の対応について考えました。
パターン1 呼び出し元Delegateメソッド内で分岐を増やす
ボツ。
呼び出すたびに見づらくなるし、その場しのぎにも程がある。
CallFrom.swift
func alertClose(alertReturn: Alert.AlertReturn) {
switch alertReturn{
case .Cancel:
if(callTimes = 0){
break
}else{
break
}
case .Value1:
if(callTimes = 0){
break
}else{
break
}
case .Value2:
if(callTimes = 0){
break
}else{
break
}
case .Value3:
if(callTimes = 0){
break
}else{
break
}
default:
break;
}
}
パターン2 呼び出し先クロージャ内で分岐
ボツ。
パターン1よりマシな気もするけど、パターン1より実行時例外が増えそう。
Common.swift
let cancelAction:UIAlertAction = UIAlertAction(title: "キャンセル",
style: UIAlertActionStyle.Cancel,
handler:{
(action:UIAlertAction!) -> Void in
if(isFirstCall){
self.delegate.alertClose(AlertReturn.Cancel)
}else{
self.delegate.alertClose2(AlertReturn.Cancel)
}
})
alert.addAction(cancelAction)
パターン3 タイトルは何だったのか?オブジェクト生成時にクロージャでデリゲート内を書き換える
とりあえずこのパターンでやっていこうかと思います。
呼び出し元でオブジェクトを生成する時にクロージャ内で処理を書く。
ただアラートからの戻り値によって更にアラートを生成する場合はアラートが連鎖的に動作してソースが汚い。
(この動作がいかがなものかということは置いておいて・・・・)
精々2階層程度にとどめておくなら問題ないかなぁ。
(注)ちゃんと検証してません
・デリゲート実装部分
CallFrom.swift
var alertAction:Alert.AlertReturn -> () = {(alertReturn:Alert.AlertReturn) -> () in
println("not implement")
}
func alertClose(alertReturn: Alert.AlertReturn) {
self.alertAction(alertReturn)
}
・アラートを生成する
CallFrom.swift
var alert = Alert()
alert.title = "アラート"
alert.message = "アラートです"
alert.delegate = self
alert.defaultVal1 = Alert.AlertDefault(title: "OK", alertReturn: Alert.AlertReturn.Value1)
//修正部分
self.alertAction = {(alertReturn:Alert.AlertReturn) -> () in
switch alertReturn{
case .Cancel:
break
case .Value1:
println("1")
break
case .Value2:
println("2")
break;
case .Value3:
println("3")
break;
default:
break;
}
}
alert.showAlertController(self)
まとめ
ポップアップ画面を作成するのが面倒なのでUIAlertControllerでしのげるかと思っての試みでした。やはりポップアップ画面を作成してカスタマイズしていったほうが使い勝手はいいですよね。
いい方法があればコメント下さい。