21262


UIAlertControllerを使用して「OK」と「キャンセル」のボタンを持ったActionSheetを表示し、  
「OK」の場合trueを、「キャンセル」の場合falseを返す関数を実装したいと考えています。

以下のように実装してみたのですが、ユーザーの選択を待たずに関数が終了してしまいます。  
ユーザーの選択を戻り値と取得するにはどのようにするのが良いでしょうか？  
アホな質問で申し訳ありませんが、よろしくお願いいたします。

[code]

    /// 確認メッセージ表示
    class func confirm(vc: UIViewController, strMsg: String, strTitle: String = "") -> Bool {
        var ret: Bool = true
        let dialog = UIAlertController(title: strTitle, message: strMsg, preferredStyle: .ActionSheet)
        let act1 = UIAlertAction(title: "OK", style: .Default) { action in
            ret = true
        }
        let act2 = UIAlertAction(title: "キャンセル", style: .Cancel) { action in
            ret = false
        }
        dialog.addAction(act1)
        dialog.addAction(act2)
    
        vc.presentViewController(dialog, animated: true, completion: nil)
        return ret
    }
    
[/code]


CC BY-SA 3.0
2016-01-24T10:39:16.960
21259
2016-01-24T11:31:53.147
13962
question
swift
UIAlertControllerで押されたボタンをTrue/Falseで取得したい


コメントしていただいたような使い方であれば、true/falseを受け取るようなクロージャーを渡せるようにしてしまうのが簡単だと思います。

[code]

    extension UIViewController {
        /// 確認メッセージ表示
        func confirm(strMsg: String, strTitle: String = "", handler: Bool->Void) {
            let dialog = UIAlertController(title: strTitle, message: strMsg, preferredStyle: .ActionSheet)
            let act1 = UIAlertAction(title: "OK", style: .Default) { action in
                handler(true)
            }
            let act2 = UIAlertAction(title: "キャンセル", style: .Cancel) { action in
                handler(false)
            }
            dialog.addAction(act1)
            dialog.addAction(act2)
    
            self.presentViewController(dialog, animated: true, completion: nil)
        }
    }
    
[/code]

ついでですが、特定クラスのクラスメソッドとせずに、UIViewControllerのextensionとして定義すると、どのUIViewControllerからも使えて便利ですよ。

使うときはこんなイメージになります。

[code]

    @IBAction func deleteRecord(_: AnyObject) {
        //何らかの前処理
        //...
        confirm("レコードを削除して良いですか", handler: {confirmed in
            if confirmed {
                //削除処理を実行
                //...
            } else {
                //キャンセルであれば何もしない
            }
        })
        //これ以降はメソッドの中に処理を書いてはいけない
    }
    
[/code]


CC BY-SA 3.0
2016-01-24T11:31:53.147
21262
2016-01-24T11:31:53.147
13972
21259
answer