1

我有一个getLocation方法可以初始化 myCLLocationManager并调用startUpdatingLocation. 在我得到用户的位置后,我打电话给stopUpdatingLocation.

稍后,当用户按下刷新时,我会调用一个调用方法reloadDatagetLocation以便获取用户的最新位置。但是,这永远不会调用该locationManager:didUpdateToLocation:fromLocation 方法..所以我永远不会得到用户的最新位置。可能是什么问题?

-(void) getLocation {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;
[self.locationManager startUpdatingLocation];
}

- (void) locationManager: (CLLocationManager *)manager 
 didUpdateToLocation: (CLLocation *)newLocation
        fromLocation:(CLLocation *)oldLocation
{
    if (oldLocation!= nil) { // make sure to wait until second latlong value
        [self setLatitude:newLocation.coordinate.latitude];
        [self setLongitude: newLocation.coordinate.longitude];
        [self.locationManager stopUpdatingLocation];
        self.locationManager.delegate = nil;
        self.locationManager = nil;
        [self makeUseOfLocationWithLat:[self getLatitude] andLon:[self getLongitude]];
    }
}

-(void) reloadData {
    [self getLocation];
}
4

3 回答 3

1

真的有必要分配一个新的CLLocationManager吗?尝试只分配一次(例如在您的 init 中),然后按需调用 startUpdatingLocation 和 stopUpdatingLocation。对我来说,这个解决方案效果很好。

于 2012-07-12T08:13:12.250 回答
1

你在测试期间移动吗?因为我认为回调只会被触发,当:

  • 你打电话startUpdatingLocation
  • 您的位置发生变化
  • 位置管理器获得更好的结果(更详细)

因此,我认为对于您的用例:由于您不移动,因此locationManager:didUpdateToLocation:fromLocation:只会在您点击刷新后调用一次回调,并且由于没有旧位置,您将不会进入该if案例。

另一件事:您的班级中绝对应该只有一个 CLLocationManager。我每个项目/应用程序只使用一个(包装在一个单例中)。这是首选的方法!另外我认为这将保留 oldLocation 值,以便您的问题可以通过更改来解决。

最好的,克里斯蒂安

于 2012-07-12T08:50:28.597 回答
0

你可以试试这个,这将帮助你每次打开页面时更新。因为如果你把 startUpdatingLocation 放在 viewdidload 中,它只会第一次加载

-(void)viewWillAppear:(BOOL)animated
{
    [locationManager startUpdatingLocation];
}
于 2012-07-26T06:03:07.920 回答