Estoy usando swift 4
y estoy tratando de crear una vista de alertView
cuando hay un error al registrar a un usuario que usa Firebase
. Tengo una IBAction
para el botón de registro que registrará al usuario usando texto de dos textfields
de texto, uno para correo electrónico y otro para contraseña.
Básicamente, estoy tratando de mostrar una vista de alertview
cuando hay un error con el proceso de registro, por ejemplo, hay un textfield
.
He adjuntado una captura de pantalla de la función donde está ocurriendo. Sé que, de hecho, estoy recibiendo un error porque la declaración de impresión genera un error, si lo hay.
Independientemente de si hay un error o no, no se muestra ninguna vista de alerta y la aplicación realiza la transición de todos modos.
2019-01-15 21:40:26.368924-0500 Pronto[9036:225268] Advertencia: intento de presentar cuya vista no está en la jerarquía de ventanas
Esta es la salida que obtengo para la vista de alerta que ahora aparece. He mirado todas las otras publicaciones sobre este mismo problema, pero ninguna parece funcionar.
Este problema ocurre debido a su jerarquía de vistas.
Debe averiguar cuál es su controlador de vista Actual/Superior en la jerarquía de vista y presentar su alerta sobre él.
Para averiguar el controlador de vista superior, use el siguiente código:
func getTopMostViewController() -> UIViewController? { var topMostViewController = UIApplication.shared.keyWindow?.rootViewController while let presentedViewController = topMostViewController?.presentedViewController { topMostViewController = presentedViewController } return topMostViewController }
Y presente su alerta sobre el controlador de vista superior y use el hilo principal para presentar una alerta porque los cierres pueden haber funcionado en otro hilo.
DispatchQueue.main.async { getTopMostViewController()?.present(alertController, animated: true, completion: nil) }
Consulte esta respuesta de pila: Swift 3 Intento de presentar cuya vista no está en la jerarquía de ventanas
Intente usar ViewDidAppear
en lugar de View did Load.
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) }
Puede obtener el controlador de vista superior y hacer que ese controlador de vista presente la alerta. Entonces, en lugar de self.present
use este enfoque y vea si funciona:
let topViewController = UIApplication.shared.keyWindow?.rootViewController topViewController?.present(alertController, animated: true, completion: nil)
También intente presentar en el hilo principal, ya que está tratando de mostrar la alerta en el controlador de finalización createUser:
DispatchQueue.main.async { self.present(alertController, animated: true, completion: nil) }