4
4

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をクロージャで処理したくない

Last updated at Posted at 2015-04-02

どういう経緯?

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の処理が書き分けられない。
・そもそも分かりづらい。

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

4
4
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
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?