我是新來的ObjC,我正在努力與CLGeocoder。我希望能夠使用reverseGeocodeLocation
獲取一個字符串,其中包含用戶按下「完成」按鈕時傳遞給我的委託的用戶位置。CLGeocoder reverseGeocodeLocation。第一次在[地標計數= 0]?
因此,用戶觸發顯示MapViewController,我調用viewDidLoad
中的reverseGeocodeLocation,但第一次調用[placemarks count = 0]
,並且我沒有地標來獲取我需要的信息。用戶第二次觸發MapViewController的顯示時,地標數組已被填充並且一切正常。
我懷疑這是與reverseGeocodeLocation做一個異步調用 - 但我不知道如何解決這個問題。我嘗試在網上搜索,但沒有任何東西似乎幫助我瞭解我在做什麼錯誤,以及我如何解決這個問題。提前致謝。
@interface MapViewController()
@property (strong, nonatomic) CLGeocoder *geocoder;
@property (readwrite, nonatomic) NSString *theLocationName;
@end
@implementation MapViewController
@synthesize mapView, geocoder, delegate = _delegate, theLocationName = _theLocationName;
- (void)viewDidLoad
{
[super viewDidLoad];
self.mapView.delegate=self;
self.mapView.showsUserLocation = YES;
[self theUserLocation];
}
-(void)theUserLocation
{
if (!geocoder)
{
geocoder = [[CLGeocoder alloc] init];
}
MKUserLocation *theLocation;
theLocation = [self.mapView userLocation];
[geocoder reverseGeocodeLocation:theLocation.location
completionHandler:^(NSArray* placemarks, NSError* error)
{
if ([placemarks count] > 0)
{
CLPlacemark *placemark = [placemarks objectAtIndex:0];
[self setTheLocationName: placemark.locality];
}
}];
- (IBAction)done:(id)sender
{
[[self delegate] mapViewControllerDidFinish:self locationName:[self theLocationName]];
}
@end
謝謝您的回覆。接受我的道歉,因爲我仍在拼命試圖瞭解這是如何工作的。鑑於我沒有留出足夠的時間來了解用戶的位置,我認爲我會將該調用轉換爲[self theUserLocation]以執行完成按鈕。我的推理是,到目前爲止,地圖已經被顯示,並且正在顯示用戶放大的位置的引腳 - 所以用戶位置必須是已知的 - 但是這也不起作用。 –
啊,剛剛纔明白了,因爲地理編碼器花了一些時間做一次經/緯度查找,所以剩下的Done代碼在地理編碼器可以提供答案之前執行。 –
我已經實現了didUpdateUserLocation:方法,其中放置了所有用於放大用戶位置的代碼。我只是將[self theUserLocation]方法移到這裏 - 現在它工作了!我並不是100%確定這是水密的,因爲我擔心如果地理編碼器花了一段時間來做它的經緯度查找,用戶仍然可以在答案之前點擊完成按鈕? –