2011-10-21 17 views
4

私はいくつかのチュートリアルに従って、私のひどいコードを混ぜる。今私は私の現在の場所を得ることができます。ボタンをタップすると、現在の位置にあるピンがトリガーされます。ピンをタップすると、メッセージに自分の現在のアドレスが表示されます。現在のユーザーの住所のアドレスを取得

私は2つの質問があります:私は、より正確なアドレスを取得できないのはなぜ

  1. を?今、私は国、都市、地区の住所を受け取りますが、道路の名前はありません。

  2. 現在の場所の住所の「テキスト」を取得するにはどうすればよいですか? UILabelにアドレスを表示したいのですが、その方法はわかりません。

ありがとうございました!ここ

が.hのここ

#import <UIKit/UIKit.h> 
#import "MapKit/MapKit.h" 
#import "CoreLocation/CoreLocation.h" 

@interface UserLocationAddressViewController : UIViewController  <MKMapViewDelegate,MKReverseGeocoderDelegate> 
{ 
    MKMapView *userLocationAddMapView; 
    CLLocationManager *locationManager; 
} 

@property (nonatomic, retain) MKMapView *userLocationAddMapView; 

-(IBAction)getUserLocationAddress:(id)sender; 

@end 

とは.Mだ

#import "UserLocationAddressViewController.h" 

@implementation UserLocationAddressViewController 

@synthesize userLocationAddMapView; 

-(IBAction)getUserLocationAddress:(id)sender 
{ 
    MKReverseGeocoder *geoCoder = [[MKReverseGeocoder alloc] initWithCoordinate:locationManager.location.coordinate]; 
    geoCoder.delegate = self; 
    [geoCoder start]; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

-(void)dealloc 
{ 
    [userLocationAddMapView release]; 
    [super dealloc]; 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

self.userLocationAddMapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; 
    userLocationAddMapView.showsUserLocation = YES; 
    userLocationAddMapView.delegate = self; 
    self.userLocationAddMapView.mapType = MKMapTypeStandard; 

    locationManager = [[CLLocationManager alloc] init]; 
    [locationManager startUpdatingLocation]; 
    CLLocationCoordinate2D coordinate = locationManager.location.coordinate; 

    MKCoordinateRegion mapRegion; 
    mapRegion.center = coordinate; 
    MKCoordinateSpan mapSpan; 
    mapSpan.latitudeDelta = 0.006; 
    mapSpan.longitudeDelta = 0.006; 
    mapRegion.span = mapSpan; 
    [userLocationAddMapView setRegion:mapRegion animated:YES]; 
    self.userLocationAddMapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    [self.view addSubview:self.userLocationAddMapView]; 

    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Get Add" style:UIBarButtonItemStylePlain target:self action:@selector(getUserLocationAddress:)] autorelease]; 
} 

-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark 
{ 
    NSLog(@"placemark %f %f", placemark.coordinate.latitude, placemark.coordinate.longitude); 
    NSLog(@"addressDictionary %@", placemark.addressDictionary); 
    [userLocationAddMapView addAnnotations:[NSArray arrayWithObjects:placemark, nil]]; 
    [geocoder release]; 
} 

-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error 
{ 
    NSLog(@"reverseGeocoder fail"); 
    [geocoder release]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

@end 

答えて

3

はちょうどこのデリゲートメソッドを置くだ、私は、これはあなたを助けることを願っています。時々座標が十分に正確でないと、サービスが近似アドレスを生成することはできませんbeacause

-- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error { 
    NSLog(@"MKReverseGeocoder has failed."); 

} 

-- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark { 
    currentLocation = [placemark.locality stringByAppendingFormat:@", "]; 
    currentLocation = [currentLocation stringByAppendingString:placemark.country]; 
    [indicator stopAnimating]; 
    txtLocation.text = currentLocation; 

} 
+0

これはCLGeocoder提案のためのiOS 5 – Rob

+0

MK_CLASS_DEPRECATED(NA、NA、3_0、5_0) – VietHung

1

私は同じ問題を持っている、MKReverseGeocoderは常に、完全なアドレスを返しません。 最良の結果を得るために、私はyahooに対して他の逆ジオコーディングを実装しました。だから基本的にMKReverseGeocoder(Google)が完全なアドレスを返さない場合、私は近似値を生成することができるyahooを問い合わせる。一方

が、それはIOS 5で廃止されましたMKReverseGeocoderとcarrefulことが、彼らはそれはiOS5をリンゴによってきたとしてあなたは本当にMKReverseGeocoderを使用してはならない代わりに

+0

+1で廃止されました。 –

6

、あなたが本当にすべきCLGeocoderを使用するrecommand CLGeocoderを使用してください。次の例では、NSArray *目印に基づいた1トンの情報が返されます。それらを反復してassoc配列のキーを呼び出すことができます。

#import "MapPoint.h" 

@implementation MapPoint 
@synthesize coordinate, title, dateAdded, subtitle, city, reverseGeo; 

-(id)initWithCoordinates:(CLLocationCoordinate2D)c 
        title:(NSString *)t { 

    self = [super init]; 
    if (self) { 

     coordinate = c; 
     [self setTitle: t]; 
     [self setCurrentCity: [[CLLocation alloc] initWithLatitude:c.latitude longitude:c.longitude]]; 

     [self setDateAdded: [[NSDate alloc] init]]; 

    } 
    return self; 

} 

-(void)setCurrentCity: (CLLocation *)loc { 

    if (!self.reverseGeo) { 
     self.reverseGeo = [[CLGeocoder alloc] init]; 
    } 

    [self.reverseGeo reverseGeocodeLocation: loc completionHandler: 
    ^(NSArray *placemarks, NSError *error) { 

     for (CLPlacemark *placemark in placemarks) { 

      NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
      [formatter setTimeStyle:NSDateFormatterNoStyle]; 
      [formatter setDateStyle:NSDateFormatterLongStyle]; 

      NSString *dateString = [formatter stringFromDate: [self dateAdded]]; 
      [self setSubtitle: [dateString stringByAppendingString: [placemark locality] ] ];    

     } 
    }]; 
} 

@end 
関連する問題