iPhone: UIAlert de diálogo aparece 3 veces por cada llamada
-
20-09-2019 - |
Pregunta
Tengo un UIAlert que aparece 3 veces cada vez que se llama. Aparece y desaparece antes de que pueda hacer clic en él. Podría ser que la viewDidLoad
sí está siendo llamado 3 veces?
He implementado un UIAlert en el viewDidLoad
de mi aplicación:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:alertMessage delegate:self cancelButtonTitle:ok otherButtonTitles:nil];
Este es el viewDidLoad
en el RootViewController, que gestiona los puntos de vista:
- (void)viewDidLoad {
Kundenkarte *kartenAnsicht = [[Kundenkarte alloc]
initWithNibName:@"Kundenkarte" bundle:nil];
kartenAnsicht.rootViewController = self;
kartenAnsicht.viewDidLoad;
self.map = kartenAnsicht;
[self.view addSubview:kartenAnsicht.view];
[kartenAnsicht release];
// [super viewDidLoad];
}
El viewDidLoad
que evoca la UIAlert está en el controlador de vista kartenAnsicht
.
Espero que alguien me puede ayudar porque estoy sin ideas.
Solución
En primer lugar, nunca se debe poner cualquier tipo de pantalla en viewDidLoad
. Este método está diseñado para detrás de la configuración de escenas después de la vista se leyó por primera vez a partir de cacao. No hay certeza de que se va a llamar cada vez que la vista muestra porque después de la primera vez que se carga, la vista puede que mantienen en la memoria y no se vuelven a cargar a partir de cacao.
En su lugar, poner la llamada para evocar la NSAlert en viewWillDisplay
o viewDidDisplay
. Esto mostrará la alerta cada vez que la vista aparece.
No creo que viewDidLoad
se llama tres veces, pero para comprobar que sólo hay que poner un NSLog en el método para ver cuántas veces se le llama.
Cuando usted dice que:
He implementado un NSAlert en el viewDidLoad () de mi aplicación:
... ¿qué significa eso? ¿Qué objeto tiene exactamente el método? Si es el delegado aplicación, esto no funcionará porque el protocolo de aplicación delegado no responde a viewDidLoad
. Tiene que ser en un UIViewController.
Edit01:
Vea este post que tenía el mismo problema: UIAlertView aparece tres veces por llamada en lugar de sólo una
Respuesta corta: Matas a la alerta por la liberación de la misma. O bien retenerlo como una propiedad del controlador de vista o, mejor aún, mostrar la alerta con runModal
en lugar de show
y capturar el número de botón respondido de inmediato.
Otros consejos
No es necesario llamar -viewDidLoad
mismo, se ejecuta automáticamente por el mecanismo de la SEMILLA de carga. Eso significa que usted obtiene invocaciones extra de -viewDidLoad
: Uno. Por su diseño, y extras cada vez que se llame
Sería de gran ayuda para ver el código torno a la llamada de alerta.
Estoy utilizando una alerta cada vez que cambia de accesibilidad. Desde la accesibilidad se comprueba en repetidas ocasiones, la alerta podría conseguir pedido en repetidas ocasiones. Para aliviar esto, envuelvo el código de alerta de este modo:
if (!myAlert) { /* set up and show myAlert */ }
Sin embargo, un problema con esto es que cuando se hace clic en el botón Cancelar, la alerta se mantendrá no nulo, y por lo tanto nunca puede mostrar de nuevo debido a que condicional. Si alguien podría añadir a esta respuesta con una solución para eso, que sería grande. Asumo que puedo agregar un controlador para el botón de cancelación que destruirá MyAlert.