Tengo una vista de tabla que, cuando se carga, cada celda podría devolver un NSError, que he elegido mostrar en un UIAlertController. El problema es que obtengo este error en la consola si se devuelven varios errores.
Advertencia: Intente presentar UIAlertController: 0x14e64cb00 en MessagesMasterVC: 0x14e53d800 que ya se está presentando (nulo)
Idealmente, idealmente me gustaría manejar esto en mi método de extensión UIAlertController.
class func simpleAlertWithMessage(message: String!) -> UIAlertController {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: "Ok", style: .Cancel, handler: nil)
alertController.addAction(cancel)
return alertController
}
Según la respuesta de Matt, cambié la extensión a una extensión UIViewController, es mucho más limpia y ahorra mucho código presentViewController.
func showSimpleAlertWithMessage(message: String!) {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: "Ok", style: .Cancel, handler: nil)
alertController.addAction(cancel)
if self.presentedViewController == nil {
self.presentViewController(alertController, animated: true, completion: nil)
}
}
ios
uialertcontroller
nombre de usuario oculto
fuente
fuente
Respuestas:
No es el UIAlertController el que "ya está presentando", es MessagesMasterVC. Un controlador de vista solo puede presentar otro controlador de vista a la vez. De ahí el mensaje de error.
En otras palabras, si le ha dicho a un controlador de vista
presentViewController:...
que lo haga, no puede volver a hacerlo hasta que se haya descartado el controlador de vista presentado.Puede preguntar a MessagesMasterVC si ya está presentando un controlador de vista examinando su
presentedViewController
. Si no es asínil
, no se lo digas,presentViewController:...
ya está presentando un controlador de vista.fuente
fuente
UIAlertController
disparo en una sucesión corta. Compruebe esto si tiene un problema similar.Bueno, las soluciones sugeridas arriba tienen un problema esencial desde mi punto de vista:
Si le pregunta a su ViewController, si el atributo 'PresentViewController' es nulo y la respuesta es falsa, no puede llegar a la conclusión de que su UIAlertController ya está presentado. Podría ser cualquier ViewController presentado, por ejemplo, un popOver. Entonces, mi sugerencia para verificar seguramente si la alerta ya está en la pantalla es la siguiente (transmita el PresentViewController como un UIAlertController):
}
fuente
Aquí hay una solución que uso en Swift 3. Es una función que muestra una alerta al usuario, y si la llama varias veces antes de que el usuario haya descartado la alerta, agregará el nuevo texto de alerta a la alerta que ya se está presentando. . Si se presenta alguna otra vista, la alerta no aparecerá. No todos estarán de acuerdo con ese comportamiento, pero funciona bien para situaciones simples.
fuente
Simplemente podemos comprobar si se presenta algún controlador de vista.
si se presenta, compruebe si es una especie de UIAlertController.
fuente
puede probar, en una sola línea, si ya se ha presentado una alerta:
fuente
Esta categoría puede administrar automáticamente todos los controladores modales incluidos de UIAlertController.
UIViewController + JCPresentQueue.h
fuente
Lo usé para detectar, eliminar y alertar.
Primero creamos una alerta con la siguiente función.
Y en alguna otra parte de tu código
fuente
Para el idioma Swift más reciente, puede usar lo siguiente:
fuente
Descarte el controlador actual y presente el controlador de alerta como
fuente
Para aquellos que no saben cómo obtener la mayoría de Viewcontroller
Para aquellos que no saben cómo obtener la mayoría de Viewcontroller
fuente
Descubrí que necesitaba crear una cola para apilar las solicitudes de UIAlertController.
fuente
Simplemente descarte el controlador actual y presente el que desee, es decir
self.dismiss(animated: false, completion: nil)
self.displayAlertController()
fuente