3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Swift】UIAlertControllerのActionをクロージャで処理したくない2

Last updated at Posted at 2015-04-03

【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でしのげるかと思っての試みでした。やはりポップアップ画面を作成してカスタマイズしていったほうが使い勝手はいいですよね。

いい方法があればコメント下さい。

次⇒【Swift】UIAlertControllerのActionをクロージャで処理したくない まとめ

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?