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:
- Construcción limpia
- Eliminar archivo de datos derivados
- Eliminar aplicación del simulador
- Limpiar una vez más
- Reiniciar Xcode y Simulator
- 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()