//EDIT2:也许这可以解决您的问题,实现您自己的坐标设置器并在那里请求您的反向地理编码器:
-(NSString *)subtitle{
if (!subtitle) {
return @"No Street";
} else {
return subtitle;
}
}
-(NSString *)title{
return @"Saved position";
}
- (void)setCoordinate:(CLLocationCoordinate2D)c {
MKReverseGeocoder *rvg = [[MKReverseGeocoder alloc] initWithCoordinate:c];
rvg.delegate = self;
[rvg start];
coordinate = c;
}
-(id)initWithCoordinate:(CLLocationCoordinate2D) coor{
self.coordinate=coor;
NSLog(@"%f,%f",coor.latitude,coor.longitude);
return self;
}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
NSLog(@"fail %@", error);
}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
self.subtitle = [placemark.addressDictionary valueForKey:@"Street"];
}
// 原文:
首先让我们谈谈你的错误:D
return [NSString stringWithFormat:@"%f", streetAddress];
%f 用于浮点值,因此不会显示字符串。
第二件事,您的变量streetAddress 此时不存在,您应该通过将其写入头文件来使其可访问。
然后在initWithCoordinate: 你调用return self; 这条线之后的所有东西都不会被调用。所以你的ReverseGeocoder 永远不会开始。
NSString *streetAddress = …
在这里你想保存你的地址,但你只把它写到一个只存在于这个方法中的变量中。方法完成后,此变量将被释放。如果你在头文件中定义了它,你可以把它保存到你的类范围变量中。
现在让我们谈谈如何做到这一点。我要做的是将反向地理编码器从您的注释中取出并将其放入您的 mapView 控制器中。然后,如果您获得了新位置,则可以更改注释的副标题。
[[mapView.annotations objectAtIndex:0] setSubtitle:@"Address Information"];
//编辑:您可以登录您的didFailWith,您会看到他无法申请该职位。即使你把你的 reverseGeocoder-init 放在 return 上面,它仍然没有足够的时间来请求位置。