Приложение для iPhone, отображающее расстояние места в таблице
У меня есть приложение, которое перечисляет ряд мест, которые имеют свои широты и долготы, хранящиеся в базе данных. Я заполняю список с помощью JSON. И тогда я отображаю результат в динамической таблице. В камерах у меня расстояние в километрах от места встречи. Я нахожу это расстояние, получая текущее местоположение пользователей и вычисляя расстояние с координатами места.
Он работает нормально, но моя проблема в том, что при загрузке вида расстояния становятся неправильными, пока через 3-5 секунд, когда пользовательское местоположение обновляется, он показывает правильные расстояния.
Я получаю местоположение пользователя и заполняю ячейки в viewdidload.
У меня вопрос: возможно ли получить местоположение пользователя в предыдущем представлении и передать его в это представление так, чтобы показанные расстояния изначально были правильными?
Вот код:
Сначала я получаю пользователя loc в viewdidload:
- (void)viewDidLoad {
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
[locationManager startUpdatingLocation];
Затем дальше, чем я получаю мои данные JSON и т. Д. Затем я делаю tableView:
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [rows count];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
// int degrees = newLocation.coordinate.latitude;
// double decimal = fabs(newLocation.coordinate.latitude - degrees);
// int minutes = decimal * 60;
// double seconds = decimal * 3600 - minutes * 60;
// NSString *lat = [NSString stringWithFormat:@"%d° %d' %1.4f\"",
// degrees, minutes, seconds];
NSString *lat = [NSString stringWithFormat:@"%f", newLocation.coordinate.latitude];
latLabel.text = lat;
// degrees = newLocation.coordinate.longitude;
// decimal = fabs(newLocation.coordinate.longitude - degrees);
// minutes = decimal * 60;
// seconds = decimal * 3600 - minutes * 60;
// NSString *longt = [NSString stringWithFormat:@"%d° %d' %1.4f\"",
// degrees, minutes, seconds];
NSString *longt = [NSString stringWithFormat:@"%f", newLocation.coordinate.longitude];
longLabel.text = longt;
//CGFloat Alat = [lat floatValue];
//CGFloat Alon = [longt floatValue];
self.aalat = lat;
self.aalon = longt;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
// Configure the cell.
NSDictionary *dict = [rows objectAtIndex: indexPath.row];
THELATITUDE = [dict objectForKey:@"L_LAT"];
THELONGITUDE = [dict objectForKey:@"L_LON"];
CGFloat Nlat = [THELATITUDE floatValue];
CGFloat Nlon = [THELONGITUDE floatValue];
CGFloat NNlat = [aalat floatValue];
CGFloat NNlon = [aalon floatValue];
// NSLog(@"lat1: %f", Nlat);
// NSLog(@"Lon1: %f", Nlon);
// NSLog(@"lat2: %f", NNlat);
// NSLog(@"Lon2: %f", NNlon);
// NSLog(@"aalat: %@", aalat);
// NSLog(@"aalon: %@", aalon);
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:Nlat longitude:Nlon];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:NNlat longitude:NNlon];
// NSLog(@"Distance i meters: %f", [location1 getDistanceFrom:location2]);
float mesafe1 = [location1 getDistanceFrom:location2 ] /1000;
int x1 = mesafe1 * 100.0;
float mesafe2 = (float) x1 / 100.0;
//Create a string.
NSString *strOne = [[NSString alloc] init];
NSString *strTwo = [[NSString alloc] init];
NSString *strThree = [[NSString alloc] init];
NSString *strFour = [[NSString alloc] init];
NSString *strFive = [[NSString alloc] init];
//Append strings.
strOne = @"MESAFE: ";
strTwo = [NSString stringWithFormat:@"%0g", mesafe2];
strThree = @" kilometre";
strFour = [strOne stringByAppendingString:strTwo];
strFive = [strFour stringByAppendingString:strThree];
NSString *mesafe = strFive;
cell.textLabel.text = [dict objectForKey:@"L_NAME"];
//cell.detailTextLabel.text = [dict objectForKey:@"LISTING_ID"];
cell.detailTextLabel.text = mesafe;
[cell.textLabel setTextColor:[UIColor blackColor]];
return cell;
}
2 ответа
Используйте метод NSUserDefault, чтобы сохранить широту и долготу текущего местоположения пользователя и использовать его в своем представлении. менеджер обновлений местоположения - запуск, а не остановка, так что вы можете точно определить широту и долготу
использовать его при обновлении местоположения пользователя
[[NSUserDefaults standardUserDefaults] setObject:latitude forKey:@"latitude"];
[[NSUserDefaults standardUserDefaults] setObject:latitude forKey:@"longitude"];
используйте его там, где вы рассчитываете расстояние
NSString *lat = [[NSUserDefaults standardUserDefaults] objectForKey:@"latitude"];
NSString *long = [[NSUserDefaults standardUserDefaults] objectForKey:@"longitude"];
Извлечь местоположение пользователя в предыдущем представлении, а затем при загрузке представления списка отправить данные в представление следующим образом (в этом случае userLocation может быть строкой JSON с длиной и широтой)
- (void) loadVenuesListView {
VenuesViewController *venuesView = [[VenuesViewController alloc] initWithNibName:@"VenuesViewController" bundle:nil];
venuesView.userLocation = fetchedUserLocation;
[[self navigationController] pushViewController:venuesView animated:YES];
[venuesView release];
}
Затем в вашем VenuesViewController вы должны создать свойство:
@property (nonatomic, retain) NSString *userLocation;