UIAlertController 不在不同入口点的层次结构中

UIAlertController not in hierarchy in different entrance point

我有一个人们可以用来请求服务的应用程序。我有一个选项卡栏控制器,它在第一个选项卡上使用导航控制器,该控制器有几个页面用于不同的内容,如服务、位置和客户信息。所有都有 UIAlertViews,当我将 tabBarController 作为应用程序入口点时,一切都很好。然后我决定添加一个不同的 UIViewController,他们可以 select tabBarController 或不同的 tabBarController。如果有意义的话,有点像 2 个应用程序。当我将该 UIViewController 作为应用程序入口点时,所有 UIAlertViews 都可以工作,但最后一个除外。它说 "Warning: Attempt to present on whose view is not in the window hierarchy!." 这是我的代码

@IBAction func send(_ sender: Any)
{

    name.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    year.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    make.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    model.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    color.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    note.resignFirstResponder()
    dismiss(animated: true, completion: nil)

    let alertController = UIAlertController(title: "You will now email your service request. The recipient email adress and message will be preset, all you have to do is hit send.", message: "Message and data rates may apply.", preferredStyle: .alert)
    let okAction = UIAlertAction(title: "ok", style: UIAlertActionStyle.default)
    {
        UIAlertAction in
        let mailcomposedViewController = self.configureMailController()
        if MFMailComposeViewController.canSendMail()
        {
            self.present(mailcomposedViewController, animated: true, completion: nil)
        }
        else
        {
            self.showMailError()
        }
    }

    alertController.addAction(okAction)


    self.present(alertController, animated: true, completion: nil)
}

谁能告诉我为什么警报在一个入口点而不是另一个入口点起作用的正确方向?

当我将应用程序入口点放在选项卡栏控制器(上图)上时,一切正常。但是,当我将入口点作为 UIView(下图)时,只有最后一部分不起作用。

使用此代码:

    let yourCurrentVisibleViewController = UIApplication.shared.keyWindow!.rootViewController

    yourCurrentVisibleViewController.present(alertController, animated: true, completion: nil)

或者将您的控制器设为上述 yourCurrentVisibleViewController 的子控制器。也许您尝试在您的控制器未出现之前调用方法。

问题出在这一行:

dismiss(animated: true, completion: nil)

你说了一遍又一遍(无缘无故)。你 (self) 是一个呈现的视图控制器,所以你现在正在解雇 你自己 。因此,当您说 self.present 时,您不再处于视图层次结构中。