5933


UIAlertをいろいろなところから呼び出し可能にしたいと思っています。  
例えば

[code]

    MyAlert.show()
    
[/code]

といった感じに。

下記のようなクラスを作って表示させるのは作法としておかしいでしょうか？  
特にrootViewControllerを呼び出している辺りについてどうするのが適切でしょうか？

[code]

    import UIKit
    
    class MyAlert {
    
        class func show(){
    
            let alertTitle = "アラート"
            let alertMsg = "サンプルアラートです。"
    
            let alertController: UIAlertController = UIAlertController(title: alertTitle, message: alertMsg, preferredStyle: .Alert)
    
            let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: .Cancel) { action -> Void in
                //nothing
            }
            alertController.addAction(cancelAction)
    
            let submitAction: UIAlertAction = UIAlertAction(title: "OK", style: .Default) { action -> Void in
                //something to do
            }
            alertController.addAction(submitAction)
            var rootvc = UIApplication.sharedApplication().keyWindow?.rootViewController
            rootvc!.presentViewController(alertController, animated: true, completion: nil)
        }
    }
    
[/code]


CC BY-SA 3.0
2015-02-04T06:57:35.053
5929
2015-02-05T00:15:21.467
2015-02-04T07:12:17.037
7364
2772
question
ios swift
いろいろなところから呼び出せるUIAlertの作り方


わたしなりの考え方で、手を加えてみました。

[code]

    import UIKit
    
    class MyAlert {
    
        class func show(fromViewController viewController: UIViewController){
    
            let alertTitle = "アラート"
            let alertMsg = "サンプルアラートです。"
    
            let alertController: UIAlertController = UIAlertController(title: alertTitle, message: alertMsg, preferredStyle: .Alert)
    
            let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: .Cancel) { action -> Void in
                //nothing
            }
            alertController.addAction(cancelAction)
    
            let submitAction: UIAlertAction = UIAlertAction(title: "OK", style: .Default) { action -> Void in
                //something to do
            }
            alertController.addAction(submitAction)
    
            viewController.presentViewController(alertController, animated: true, completion: nil)
        }
    }
    
[/code]

View Controllerの実装内で呼び出す場合は、

[code]

    MyAlert.show(fromViewController: self)
    
[/code]

このように引数にselfを渡します。


CC BY-SA 3.0
2015-02-04T07:52:28.950
5933
2015-02-05T00:15:21.467
2015-02-05T00:15:21.467
7362
7362
5929
answer


ただ rootViewController に present させる構造では、rootViewController
が既に別のビューコントローラをモーダル表示している状態で期待通りに動作しないと思います。

keyWindow が正しく指定されていることが前提ですが、以下のように最前面のビューコントローラを取得して、それに present
させる必要があるのではないでしょうか。

[code]

    let keyWindow = UIApplication.sharedApplication().keyWindow!
    var frontViewController: UIViewController = keyWindow.rootViewController as UIViewController!
    while frontViewController.presentedViewController != nil {
      frontViewController = frontViewController.presentedViewController!
    }
    
    frontViewController.presentViewController(alertController, animated: true, completion: nil)
    
[/code]


CC BY-SA 3.0
2015-02-04T07:59:22.730
5934
2015-02-04T07:59:22.730
5929
answer