Swift 4尝试呈现视图不在窗口层次结构中的ViewController

Ste*_*lin 3 uialertview ios firebase swift swift4

我正在使用,swift 4并且尝试alertView使用进行用户注册时出错时尝试创建一个Firebase。我有一个IBActionfor sign up按钮,它将使用两个文本来注册用户textfields,一个用于电子邮件,一个用于密码。

我基本上是在尝试显示alertview注册过程中出现错误时(例如,有一个Empty)textfield

在此处输入图片说明

我将函数的屏幕快照附加到发生的地方。我知道我实际上遇到了错误,因为如果有一个print语句,则会输出一个错误。

无论是否存在错误,都不会显示警报视图,并且该应用程序会执行segue。

2019-01-15 21:40:26.368924-0500 Pronto [9036:225268]警告:尝试呈现其视图不在窗口层次结构中的视图

这是我现在显示的alertview的输出。我看过所有其他关于同一问题的文章,但似乎都没有。

Jar*_*ger 15

发生此问题是由于您的视图层次结构。

您需要找出视图层次结构中当前/最高视图控制器是什么,并在其上显示警报。

要找出最顶层的视图控制器,请使用以下代码:

func getTopMostViewController() -> UIViewController? {
    var topMostViewController = UIApplication.shared.keyWindow?.rootViewController

    while let presentedViewController = topMostViewController?.presentedViewController {
        topMostViewController = presentedViewController
    }

    return topMostViewController
}
Run Code Online (Sandbox Code Playgroud)

并在最顶层的视图控制器上显示警报,并使用主线程来显示警报,因为闭包可能在另一个线程上起作用。

DispatchQueue.main.async { 
    getTopMostViewController()?.present(alertController, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

请参考以下堆栈答案: Swift 3尝试显示其视图不在窗口层次结构中

  • **DispatchQueue.main.async** 是关键,兄弟!很棒的答案!为我节省了很多时间。非常感谢! (2认同)