Я полностью тупик, вот ситуация:Почему popViewController работает только каждый второй раз
Мое приложение использует базу Расположение Core, чтобы получить текущее местоположение пользователя, а затем пингует мой сервер на TrailBehind интересные места поблизости и отображает их как список. Нет проблем.
Чтобы сохранить батареи, я отключу службу GPS после получения моих данных с сервера. Если пользователь перемещается во время использования приложения и хочет получить новый список, он нажимает «Обновить» на контроллере навигации, а служба CLLocation снова активируется, новая партия данных извлекается с сервера, и таблица перерисовывается.
Пока приложение захватывает данные с моего сервера, я загружаю экран загрузки вращающимся глобусом, в котором говорится: «Загрузка, пожалуйста, подождите», и я скрываю панель навигации, чтобы они не ударяли «назад».
Итак, начальные данные захвата с сервера идут безупречно.
В первый раз, когда я нажимаю обновление, все коды выполняются, чтобы получить новое местоположение, снова пинговать сервер для нового списка данных и обновлять ячейки. Однако вместо того, чтобы загружать табличный вид, как он должен, он восстанавливает панель контроллера навигации для представления таблицы, но по-прежнему показывает мое загрузочное представление в главном окне. Это верно только на устройстве, все работает отлично в симуляторе.
ВТОРОЕ время, когда я нажимаю обновление, функция работает нормально.
ТРЕТЬЕ время, когда я нажимаю обновление, он терпит неудачу, как указано выше.
ЧЕТВЕРТОЕ время, когда я нахожусь, обновляется, он работает нормально.
ПЯТЫЙ раз, когда я нажимаю обновление, он терпит неудачу, как указано выше.
и т. Д. И т. Д., Даже обновляет успешные и нечетные обновления. Я перешагнул весь мой код за строкой, и все, кажется, выполняется нормально. Я действительно продолжал переходить к основным инструкциям, и после огромного количества щелчков «шаг за шагом» я обнаружил, что представление таблицы фактически отображается на экране в какой-то момент в CFRunLoopRunSpecific, но затем я нажал «продолжить», и мое загрузочное представление заняло экран.
Я абсолютно сбит с толку. Пожалуйста помоги!! Большое спасибо заранее за ваше понимание.
Video of the strange behavior:
Соответствующий код:
RootViewControllerMethods (Это базовый вид для этого проекта 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];
}
}
CLController Методы: В основном просто отправляет все данные прямо назад к 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];
}
}
Вы прошли через эти методы в отладчике? Запустите на нем инструменты, чтобы узнать, что вы хотите создать или удалить объект? Извините, если я оскорбляю ваш интеллект, но так как я не вижу проблемы из-за быстрого взгляда, следующая вещь, которую я бы сделал, это начать шаг ... – mikeh
Появляется ли поп, если вы покидаете приложение? Похоже, вы не оставляете приложение достаточно времени, чтобы получить исправление GPS в видео. Попробуйте установить контрольные точки в методах locationManager. –