ios swift3 uialertcontroller viewdidappear

ios - UIAlertController no desaparece



swift3 viewdidappear (5)

No estoy obteniendo lo que está mal con mi código. Simplemente estoy mostrando una alerta con el botón "Aceptar" y cuando el usuario hace clic en "Aceptar", la alerta debería continuar. Pero no se está desvaneciendo. Usando Swift3 para programar. ¿Es viewDidAppear() el lugar correcto para poner este código? ¿O estoy haciendo algo mal?

override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) present(alertController, animated: true, completion: nil) }

ACTUALIZACIÓN : Cuando puse el mismo código en otro controlador, funcionó. En el controlador original, en viewDidLoad () , tengo una llamada Async como la de abajo. Es este problema por eso?

DispatchQueue.global(qos: .background).async { self.getDetails(onCompletion: {(json: JSON) in let dict = self.convertToDictionary(text: json.stringValue) DispatchQueue.main.async { self.activityIndicator.stopAnimating() UIApplication.shared.endIgnoringInteractionEvents() //Other UI update operation } }) }

También viewWillDisappear() y viewWillAppear() , solo para establecer el título de la pantalla.


Su código se ve bien, y viewDidAppear está bien ya que su controlador de vista se cargará correctamente y no romperá el hilo principal para mostrarle la alerta. Debería haber algún otro problema con su código, (error de) Xcode o problema de datos derivados.

Puede hacer un par de cosas para ver el problema real:

  1. Construcción limpia
  2. Eliminar archivo de datos derivados
  3. Eliminar aplicación del simulador
  4. Limpiar una vez más
  5. Reiniciar Xcode y Simulator
  6. Reconstruye para ver si funciona o no.

¿Estás llamando a UIApplication.shared.beginIgnoringInteractionEvents() cualquier lugar? si es ese es tu problema


Si creamos un nuevo proyecto de "vista única" Para las dos formas siguientes de presentar la alerta obtenemos los siguientes comportamientos

override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) present(alertController, animated: true, completion: nil) }

En la consola verás

2017-08-15 16: 27: 35.871 test [66719: 7754741] Advertencia: intento de presentar en cuya vista no está en la jerarquía de la ventana!

y no hay alerta en la interfaz de usuario.

y para:

override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) present(alertController, animated: true, completion: nil) }

todo funciona como se espera

Entonces sí, la vista apareció es el lugar.

Acerca de viewDidLoad () y viewDidAppear (_ :)

Por lo que parece, el problema radica en beginIgnoringInteractionEvents

Si está poniendo su alerta en viewDidAppear , debería verla, pero si no la ve, tenga en cuenta lo siguiente:

Incluso si pones este fragmento de código en viewdidload

DispatchQueue.main.async { self.activityIndicator.stopAnimating() UIApplication.shared.endIgnoringInteractionEvents() //Other UI update operation }

se puede ejecutar más tarde (depende de cuándo finaliza el análisis) que la llamada a viewDidAppear y esto es porque:

DispatchQueue.global (qos: .background) .async

¿Verificaste esta razón?


endIgnoringInteractionEvents() está en un método asíncrono al hacer OK en OK , no se ha llamado a este método. para que no pueda descartar la alerta.


viewDidAppear() código siguiente en viewDidAppear() justo antes del código de Alerta y comenzó a funcionar. Mantuve el código por debajo en ambas ubicaciones, es decir, en Async call y en viewDidAppear()

self.activityIndicator.stopAnimating() UIApplication.shared.endIgnoringInteractionEvents()