私はこれを解決し、私がそれをどのように行ったかを共有したいと思いました:
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
I currently have the user do a long push to create an annotation on the map view. Now when the user selects the pin by pressing it, it shows the physical address instead of the longitude and latitude.
I hope this helps all others who have been searching for a way to do this.