estoy totalmente perplejo, aquí está la situación:¿Por qué popViewController sólo funcionan todas las otras veces
Mi aplicación utiliza el marco Ubicación Core para obtener la ubicación actual del usuario y luego se hace un ping a mi servidor en TrailBehind para los lugares de interés cercanos y los muestra como una lista. No hay problemas.
Para conservar las baterías, apago el servicio de GPS después de obtener mis datos del servidor. Si el usuario se mueve mientras usa la aplicación y quiere una nueva lista, hace clic en "Actualizar" en el controlador de navegación y el servicio CLLocation se activa de nuevo, se recupera un nuevo lote de datos del servidor y se vuelve a dibujar la tabla.
Mientras la aplicación está captando datos de mi servidor, cargo una pantalla de carga con un globo giratorio que dice "Cargando, espere" y oculto la barra de navegación para que no den "atrás".
Por lo tanto, la captura de datos inicial del servidor se realiza sin problemas.
La PRIMERA vez que pulso actualizar todo el código se ejecuta para obtener una nueva ubicación, hacer un nuevo ping al servidor para obtener una nueva lista de datos y actualizar las celdas. Sin embargo, en lugar de cargar la vista de tabla como debería, restaura la barra del controlador de navegación para la vista de tabla pero aún muestra mi vista de carga en la ventana principal. Esto solo es cierto en el dispositivo, todo funciona perfectamente en el simulador.
La SEGUNDA vez que pulso actualizar la función funciona normalmente.
La TERCERA vez que pulso actualizar falla como se indica anteriormente.
La CUARTA vez que pulso actualizar funciona normalmente.
La QUINTA vez que pulso actualizar falla como se indica arriba.
etc etc., incluso las actualizaciones tienen éxito y las actualizaciones impares fallan. Pasé por encima de todo mi código línea por línea y todo parece ejecutarse normalmente. De hecho, continué pisando las instrucciones básicas y después de una gran cantidad de clics "paso adelante" encontré que la vista de tabla realmente aparece en la pantalla en algún momento en CFRunLoopRunSpecific, pero luego hice clic en "continuar" y mi vista de carga se hizo cargo la pantalla.
Estoy absolutamente desconcertado. ¡¡Por favor ayuda!! Muchas gracias de antemano por su visión.
Video of the strange behavior:
código relevante:
RootViewControllerMethods (Esta es la vista base para este proyecto TableView)
- (void)viewDidLoad {
//Start the Current Location controller as soon as the program starts. The Controller calls delegate methods
//that will update the list and refresh
[MyCLController sharedInstance].delegate = self;
[[MyCLController sharedInstance].locationManager startUpdatingLocation];
lv = [[LoadingViewController alloc] initWithNibName:@"Loading" bundle:nil];
[self.navigationController pushViewController:lv animated:YES];
[super viewDidLoad];
}
- (void)updateClicked {
//When the location is successfully updated the UpdateCells method will stop the CL manager from updating, so when we want to update the location
//all we have to do is start it up again. I hope.
[[MyCLController sharedInstance].locationManager startUpdatingLocation];
[self.navigationController pushViewController:lv animated:YES];
//LV is a class object which is of type UIViewController and contains my spinning globe/loading view.
}
-(void)updateCells {
//When the Core Location controller has updated its location it calls this metod. The method sends a request for a JSON dictionary
//to trailbehind and stores the response in the class variable jsonArray. reloadData is then called which causes the table to
//re-initialize the table with the new data in jsonArray and display it on the screen.
[[MyCLController sharedInstance].locationManager stopUpdatingLocation];
if(self.navigationController.visibleViewController != self) {
self.urlString = [NSString stringWithFormat:@"http://www.trailbehind.com/iphone/nodes/%@/%@/2/10",self.lat,self.lon];
NSURL *jsonURL = [NSURL URLWithString:self.urlString];
NSString *jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL];
NSLog(@"JsonData = %@ \n", jsonURL);
self.jsonArray = [jsonData JSONValue];
[self.tableView reloadData];
[self.navigationController popToRootViewControllerAnimated:YES];
[jsonData release];
}
}
Métodos CLController: Básicamente, sólo envía todos los datos directamente de vuelta a la RootViewController
// Called when the location is updated
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
NSLog(@"New Location: %@ \n", newLocation);
NSLog(@"Old Location: %@ \n", oldLocation);
@synchronized(self) {
NSNumber *lat = [[[NSNumber alloc] init] autorelease];
NSNumber *lon = [[[NSNumber alloc] init] autorelease];
lat = [NSNumber numberWithFloat:newLocation.coordinate.latitude];
lon = [NSNumber numberWithFloat:newLocation.coordinate.longitude];
[self.delegate noteLat:lat];
[self.delegate noteLon:lon];
[self.delegate noteNewLocation:newLocation];
[self.delegate updateCells];
}
}
¿Has pasado por estos métodos en el depurador? Ejecutar instrumentos para ver si la creación/eliminación de objetos es lo que esperas? Disculpa si insulta tu inteligencia, pero como no veo el problema de un vistazo rápido, lo siguiente que hago es comenzar a ... – mikeh
¿Ocurre algo así si sales de la aplicación? Parece que no vas a dejar la aplicación el tiempo suficiente para obtener una corrección de GPS en el video. Intente establecer puntos de interrupción en los métodos de locationManager. –