Pregunta

Me estoy haciendo un comportamiento extraño de un NSAlert en dos diferentes partes de mi programa. El comportamiento es:

  1. Alerta aparece a continuación, espontáneamente desaparece.
  2. Alerta reaparece y luego permanece hasta despedido por el usuario es decir el comportamiento normal.
  3. Alerta reaparece de nuevo.

Este comportamiento sólo se produce la primera vez el método que muestra la alerta se llama. Después de esa primera vez, se comporta normalmente.

Aquí es el código de la una de las partes en las que el comportamiento se produce:

UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [locationAlert show];
        [locationAlert release];

O, si lo prefiere, con un poco más de contexto:

- (IBAction)locateMe {
NSLog(@"About to check location");
locMan = [[CLLocationManager alloc] init];
locMan.delegate = self;
locMan.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
locMan.distanceFilter = 1609; //1 mile
[locMan startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation * )oldLocation {
if (newLocation.horizontalAccuracy >= 0) {

    CLLocation *airportLocation = [[[CLLocation alloc] initWithLatitude:51.500148 longitude:-0.204669] autorelease];
    CLLocationDistance delta = [airportLocation getDistanceFrom: newLocation];
    long miles = (delta * 0.000621371) + 0.5; //metres to rounded mile
    if (miles < 3) {
        UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [locationAlert show];
        [locationAlert release];
        [locMan stopUpdatingLocation];
    } else {
        UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are not in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [locationAlert show];
        [locationAlert release];
        [locMan stopUpdatingLocation];

    }
}
}

- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"Error." message:error.code delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

[locationAlert show];
[locMan release];
locMan = nil;
}

¿Alguna idea? Gracias.

Editar ---------

El otro lugar que esto ocurre es:

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSString * errorString = [NSString stringWithFormat:@"Unable to download feed from web site (Error code %i )", [parseError code]];
NSLog(@"error parsing XML: %@", errorString);

UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[errorAlert show];
}

Para el contexto del primer caso es en el AppDelegate y el segundo en el controlador de vista para la primera vista de la ficha. El segundo problema se produce cada vez que el XML se vuelve a cargar cuando no hay conexión a Internet. El primero sólo se produce la primera vez que la función se llama.

Editar -----

Si muevo la alerta funciona. Desafortunadamente esto no es donde lo quiero!

- (IBAction)locateMe {

 UIAlertView * locationAlert = [[UIAlertView alloc] initWithTitle:@"You are in the right place." message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[locationAlert show];
/*
NSLog(@"About to check location");
locMan = [[CLLocationManager alloc] init];
locMan.delegate = self;
locMan.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
locMan.distanceFilter = 1609; //1 mile
[locMan startUpdatingLocation];*/
}

Actualización:

Me puse algunas entradas NSLog y descubrí que a pesar de la adición de la función [locMan stopUpdatingLocation] didUpdateToLocation estaba corriendo varias veces.

Creo que la desaparición espontánea ocurre porque la vista de alerta se llama de nuevo y el programa borra la primera instancia para dar paso a la segunda forma automática.

¿Alguna idea de por qué no funciona [locMan stopUpdatingLocation] sería apreciada pero en la media hora me acabo de mudar la declaración de la locationAlert de la función (por lo que es global), lo puse en el primer localizarme función y uso A continuación, la primera vez que se llama:

[locationAlert show];
locationAlert = nil;

De esta manera funciona perfectamente.

¿Fue útil?

Solución

Creo que el NSAlert desapareciendo en sí misma es la clave para resolver esto.

Es muy sencillo de explicar por qué se muestra una alerta de forma inesperada es decir, que sólo ha sido llamado inesperadamente. Sin embargo, no es tan común a descartar mediante programación una alerta. Lo que está provocando que desaparezca es más probable que la activación de la pantalla de nuevo.

Para depurar sugiero:

(1) Mirando en su código para el método – dismissWithClickedButtonIndex:animated: NSAlert y ver si de alguna manera en realidad estás descartando la alerta mediante programación.

(2) Creo que (alguien me vuelva a comprobar en esto) que una vista de alerta se añade como una subvista a cualquier vista base se encuentra actualmente en la pantalla. Podría ser que la vista base está desapareciendo por alguna razón y tomando la vista de alertas con él. Si la vista desaparece y luego reaparece con la suficiente rapidez, puede que no sea evidente cuando la alerta está situada en primer plano. (Edit:. Ver el comentario de Ed Marty abajo)

(3) Dado que esto ocurre en dos piezas separadas de la aplicación, comparar tanto para encontrar un elemento o estructura común. Ese elemento común podría ser la causa. Un problema extraño.

Edit01: Actualización para obtener información adicional

Si la variable locMan ISAN ejemplo, debería ser definido como una propiedad y se debe acceder a él cada vez que withself.locMan Al acceder directamente, pierde su gestión automática de retención.

Otros consejos

Usted no está de apagar el gerente de locación cuando se presenta por primera vez la alerta. Como la ubicación es refinado por el dispositivo (es decir, se incrementa la exactitud), su devolución de llamada será (potencialmente) llamado varias veces. Debe utilizar [LOCMAN stopUpdatingLocation] después de su pantalla de alerta.

I puse algunas entradas NSLog y descubrí que a pesar de la adición de [LOCMAN stopUpdatingLocation] la función didUpdateToLocation se ejecuta varias veces.

Creo que la desaparición espontánea ocurre porque la vista de alerta se llama de nuevo y el programa borra la primera instancia para dar paso a la segunda forma automática.

¿Alguna idea de por qué [LOCMAN stopUpdatingLocation] no funciona sería apreciada pero en la media hora que se acaba de mudar la declaración de la locationAlert de la función (por lo que es global), la pusieron en la primera localizarme la función y el uso de la raíz de la primera vez que se llama:

[locationAlert show];
locationAlert = nil;

De esta manera funciona perfectamente.

Me encontré con el mismo problema exacto con el diálogo de alerta que aparece momentáneamente, reapareciendo, y finalmente aparece de nuevo después de ser despedido. Estaba haciendo una comparación de cadenas antes de decidir para mostrar la vista de alerta:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if([string isEqualToString:@"OK"]) {
    NSLog(@"(Settings)Registration Successful");
    statusField.text = @"Registration successful!";
    [settingsActivity stopAnimating];
}
else {
    NSLog(@"(Settings)Registration Failure");
    [settingsActivity stopAnimating];

    UIAlertView * regFail = [[[UIAlertView alloc] initWithTitle:@"Registration Error!" message:@"Please check your email address and try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease];

    [regFail show];
}}

Para corregir este comportamiento simplemente verificó la cadena devuelta en lugar de simplemente mostrar la alerta:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if([string isEqualToString:@"OK"]) {
    NSLog(@"(Settings)Registration Successful");
    statusField.text = @"Registration successful!";
    [settingsActivity stopAnimating];
}
else if([string isEqualToString:@"Error"]) {
    NSLog(@"(Settings)Registration Failure");
    [settingsActivity stopAnimating];

    UIAlertView * regFail = [[[UIAlertView alloc] initWithTitle:@"Registration Error!" message:@"Please check your email address and try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease];

    [regFail show];
}

También tengo el mismo problema mientras se trabaja en Administrador de ubicaciones. Aquí he comprobado con NSLog pero está ejecutando varias veces, finalmente FOUNT que estoy creando múltiples objetos y el uso de Sharedinstance para la misma ViewController que contiene la ubicación Manger, pero yo no estoy liberando el objeto, por lo que en lugar perticular cuántos objetos si creamos que muchas veces la ubicación detects.So mientras se trabaja en la manipulación de objetos a fondo cheque LocationManger para reducir este tipo de problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top