приложение для iPhone, отображающее расстояние места в таблице - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть приложение, которое перечисляет количество мест, в которых хранятся их широта и долгота в базе данных. Я заполняю список с помощью 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 ]

2 голосов
/ 22 декабря 2011

используйте метод 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"];
0 голосов
/ 22 декабря 2011

Извлечение местоположения пользователя в предыдущем представлении, а затем при загрузке представления списка отправьте данные в представление следующим образом (в этом случае 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...