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

时间:2019-01-16 02:53:16

标签: ios swift firebase swift4 uialertview

我正在使用swift 4,并且在使用alertView注册用户时出错时,我试图创建一个Firebase。我有一个IBAction的注册按钮,它将使用两个textfields中的文本(一个用于电子邮件,一个用于密码)对用户进行注册。

基本上,我尝试在注册过程中出现错误时显示alertview,例如空的textfield

enter image description here

我已将该功能的屏幕快照附加到发生的位置。我知道我实际上遇到了错误,因为如果有一个print语句,则会输出一个错误。

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

  

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

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

4 个答案:

答案 0 :(得分:1)

尝试使用ViewDidAppear代替“查看确实加载”。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let alertViewController = UIAlertController(title: "Any", message: "Any Custom Message", preferredStyle: .alert)

    alertController.addAction(UIAlertAction(title: "ANy", style: .cancel, handler: nil))
    present(alertViewController, animated: true, completion: nil)
}

答案 1 :(得分:1)

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

  

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

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

  $fullurl = 'http://localhost:8000/comic_library/comic/2097';
  $exploded_url = explode('/',$fullurl);
  echo $final_id = end($exploded_url);

并在最上方的视图控制器上显示警报,并使用主线程显示警报,因为闭包始终在另一个线程上工作。

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

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

    return topMostViewController
}

请参考以下堆栈答案: Swift 3 Attempt to present whose view is not in the window hierarchy

答案 2 :(得分:0)

您可以获得最顶级的视图控制器,并让该视图控制器显示警报。因此,代替[options]="myConfigProvider.currencyMaskConfig"来使用这种方法,看看它是否有效:

self.present

也尝试在主线程上显示,因为您试图在createUser完成处理程序中显示警报:

let topViewController = UIApplication.shared.keyWindow?.rootViewController
topViewController?.present(alertController, animated: true, completion: nil)

答案 3 :(得分:0)

检查是否存在“双击”问题:

  1. 您不小心双击按钮
  2. signUpBtnPressed被叫了两次
  3. 第一个请求正确执行,因此启动了segue,错误为nil
  4. 第二个请求返回类似“用户已存在”的错误,然后试图显示当前控制器的警报,但是segue已经启动并且下一个控制器已经存在

此问题通过使用带有UI阻止功能的加载程序(例如SVProgressHUD)来解决-在方法的开头启动加载程序并在回调中将其关闭。