当ViewController不在Window层次结构中时,不显示Alert

时间:2016-04-27 06:01:27

标签: ios swift uiviewcontroller uinavigationcontroller uialertcontroller

我有NavigationController。在ThirdViewController我正在执行某项任务并且失败时,我使用UIAlertController显示警报消息。

有时,当我开始执行任务并返回SecondViewController时,我会在SecondViewController上显示错误消息,然后单击“确定”,导航栏下方的所有内容都会变黑。我只剩下导航栏,如果我再次回到FirstViewController,它除了导航栏之外还有相同的黑色视图。

呈现不在窗口层次结构中的ViewController的警报会产生问题。如果我不在屏幕上,我不希望显示警报。

如果我慢慢地向后滑动ViewController,它很容易重现。

处理它的最佳方法是什么?

分享我的代码,

ThirdViewController

中的按钮操作
func buttonTapped() {
        APIManager.sharedManager.getDetails(completion: { (details ,error) -> Void in
            guard error == nil else {
                Alert.errorMsg(error!.localizedDescription, viewController: self, goBack: false)
                return
            }
            print(details)
        }
    }

class Alert: NSObject {

    /* Error message */
    class func errorMsg(message: String, viewController: UIViewController?, goBack: Bool = false) {
        let alertView = UIAlertController(title: "Error", message: message, preferredStyle: .Alert)
        let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default) { (alert: UIAlertAction) -> Void in
            if goBack == true && viewController != nil {
                viewController!.navigationController?.popToRootViewControllerAnimated(true)
            }
        }
        alertView.addAction(action)
        let controller = viewController ?? UIApplication.sharedApplication().keyWindow?.rootViewController
        controller!.presentViewController(alertView, animated: true, completion: nil)
    }
}

3 个答案:

答案 0 :(得分:3)

我创建了一个CustomViewController并添加了一个属性' isUnloading'。在viewWillDisappear中,我设置了isUnloading = true。我在出示警报之前检查了房产。

答案 1 :(得分:0)

由于您没有共享任何代码,我们不确切知道那里发生了什么。但是,如果您不希望在视图控制器不在窗口层次结构中时显示警报,则可以在显示警报视图之前检查是否设置了viewController.view.window,并仅在设置时显示它。

答案 2 :(得分:0)

你可以做点什么,

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

调用alert as,

var alert = AlertHelper()
alert.showAlert(fromController: self)

请参阅this link了解更多详情。

希望这会有所帮助:)