AlertController is not in the window hierarchy

前端 未结 8 1703
北荒
北荒 2020-11-29 03:01

I\'ve just created a Single View Application project with ViewController class. I would like to show a UIAlertController from a function which is located inside my own class

相关标签:
8条回答
  • 2020-11-29 03:34

    Let's look at your view hierarchy. You have a ViewController. Then you are creating an AlertController, you are not adding it to your hierarchy and you are calling an instance method on it, that attempts to use the AlertController as presenting controller to show just another controller (UIAlertController).

    + ViewController
        + AlertController (not in hierarchy)
            + UIAlertController (cannot be presented from AlertController)
    

    To simplify your code

    class ViewController: UIViewController {
       override func viewDidLoad() {
           super.viewDidLoad()  
       }
    
       @IBAction func showAlertButton(sender: AnyObject) {
           var alert = UIAlertController(title: "abc", message: "def", preferredStyle: .Alert)
           self.presentViewController(alert, animated: true, completion: nil)
       }
    }
    

    This will work.

    If you need the AlertController for something, you will have to add it to the hierarchy first, e.g. using addChildViewController or using another presentViewController call.

    If you want the class to be just a helper for creating alert, it should look like this:

    class AlertHelper {
        func showAlert(fromController controller: UIViewController) { 
            var alert = UIAlertController(title: "abc", message: "def", preferredStyle: .Alert)
            controller.presentViewController(alert, animated: true, completion: nil)
        }
    }
    

    called as

     var alert = AlertHelper()
     alert.showAlert(fromController: self)
    
    0 讨论(0)
  • 2020-11-29 03:34

    You can use below function to call alert from any where just include these method in AnyClass

    class func topMostController() -> UIViewController {
            var topController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController
            while ((topController?.presentedViewController) != nil) {
                topController = topController?.presentedViewController
            }
            return topController!
        }
    
        class func alert(message:String){
            let alert=UIAlertController(title: "AppName", message: message, preferredStyle: .alert);
            let cancelAction: UIAlertAction = UIAlertAction(title: "OK", style: .cancel) { action -> Void in
    
            }
            alert.addAction(cancelAction)
            AnyClass.topMostController().present(alert, animated: true, completion: nil);
        }
    

    Then call

    AnyClass.alert(message:"Your Message")
    
    0 讨论(0)
提交回复
热议问题