我目前有一个应用程序,当我在地图上放置注释时,它会显示标题和副标题,副标题显示纬度/长/半径信息。
-(NSString *)title{
return @"Saved position";
}
- (NSString *)subtitle {
return [NSString stringWithFormat: @"Lat: %.4F, Lon: %.4F, Rad: %.1fm",
self.coordinate.latitude, self.coordinate.longitude, self.radius];
}
-(id)initWithCoordinate:(CLLocationCoordinate2D) coor{
self.coordinate=coor;
NSLog(@"%f,%f",coor.latitude,coor.longitude);
return self;
}
我想更改字幕行,以便显示地址。我知道这是使用CLGeocoder的反向地理编码,但我不确定如何正确地执行此操作。我在网上看了很多例子,看过苹果开发网站,但它有点压倒性。这位新手程序员真的很感激任何帮助。
答案 0 :(得分:0)
我已经解决了这个问题并想分享我是如何做到的:
RegionAnnotation.h
#import <MapKit/MapKit.h>
#import <CoreFoundation/CoreFoundation.h>
@interface RegionAnnotation : NSObject <MKAnnotation, CLLocationManagerDelegate>
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, readonly, copy) NSString *subtitle;
@property (nonatomic, readonly, copy) NSString *title;
//Reverse Geocoding
@property(nonatomic, readonly) CLPlacemark *administrativeArea;//The state
@property(nonatomic, readonly) CLPlacemark *locality; //The city
@property(nonatomic, readonly) CLPlacemark *subThoroughfare;//Street number
@property(nonatomic, readonly) CLPlacemark *thoroughfare;//Street address
@end
RegionAnnotation.m
#import "RegionAnnotation.h"
#import <AddressBookUI/AddressBookUI.h>
@implementation RegionAnnotation
@synthesize coordinate = _coordinate, subtitle = _subtitle, title = _title, administrativeArea = _administrativeArea, location = _location, locality = _locality, subThoroughfare = _subThoroughfare, thoroughfare = _thoroughfare;
- (id)init
{
self = [super init];
return self;
}
- (void) setCoordinate:(CLLocationCoordinate2D)newCoordinate
{
_coordinate = newCoordinate;
}
- (NSString *)title {
return @"Monitored Region";
}
- (void) setSubtitle:(NSString *)newSubtitle
{
_subtitle = newSubtitle;
}
-(void)reverseGeocodeLocation:(CLPlacemark *)placemark
{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
CLLocationCoordinate2D coord = self.coordinate;
CLLocation *location = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *placemark = [placemarks objectAtIndex:0];
NSLog(@"%@ %@ %@ %@",
placemark.subThoroughfare,
placemark.thoroughfare,
placemark.locality,
placemark.administrativeArea);
}];
}
- (NSString *)getAddress {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
CLLocation *location = [[CLLocation alloc] initWithLatitude:self.coordinate.latitude longitude:self.coordinate.longitude];
NSString *geoAddress = [[NSString alloc] init];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");
if (error){
NSLog(@"Geocode failed with error: %@", error);
// [self displayError:error];
return;
}
NSLog(@"getAddress Received placemarks: %@", placemarks);
CLPlacemark *placemark = [placemarks objectAtIndex:0];
// use the AddressBook framework to create an address dictionary
NSString *addressString = ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO);
_subtitle = addressString;
}];
return geoAddress;
}
@end
我目前让用户长时间在地图视图上创建注释。现在,当用户通过按下它来选择引脚时,它会显示物理地址而不是经度和纬度。
我希望这能帮助所有其他一直在寻找方法的人。