2012-12-17 40 views
0

我想使用reverseGeocodeLocation返回用戶的狀態。我正在使用此代碼從另一個視圖中提取用戶的位置。reverseGeocodeLocation存儲爲NSString生成錯誤

NSString *userState =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate  
getAddressFromLocation]; 

我收到以下錯誤: 'NSInvalidArgumentException' 的,理由是:「 - [PDCAppDelegate getAddressFromLocation]:無法識別的選擇發送到實例。下面是我在PDCAppDelegate中用來返回地址的代碼。

-(NSString *)getAddressFromLocation:(CLLocation *)location { 
NSString *address; 
CLGeocoder *geocoder = [[CLGeocoder alloc] init]; 
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError 
*error) 
{ 
    if(placemarks && placemarks.count > 0) 
    { 
     CLPlacemark *placemark= [placemarks objectAtIndex:0]; 

     NSString *address = [NSString stringWithFormat:@"%@ %@,%@ %@", [placemark 
subThoroughfare],[placemark thoroughfare],[placemark locality], [placemark 
administrativeArea]]; 

     NSLog(@"%@",address); 
    } 

}]; 

return address; 
} 

任何人都知道如何解決這個問題?謝謝!

+0

你加你的函數頭? – Misha

+0

我有我的appDelegate頭: - (NSString *)getAddressFromLocation; – Brandon

+0

我不知道我是否需要把:(CLLocation *)位置部分,但 – Brandon

回答

1

CLGeocoder方法reverseGeocodeLocation:completionHandler:異步運行。這意味着你不能從getAddressFromLocation:返回地址,因爲當你從這個方法返回時,地址沒有被設置。

當地理編碼器收到地址(或調用導致錯誤)時,它將運行completionHandler。您必須設置或顯示完成處理程序中的地址。

最簡單的將發送NSNotification,可能不是最好的,雖然方式:

-(void)getAddressFromLocation:(CLLocation *)location { 
    CLGeocoder *geocoder = [[CLGeocoder alloc] init]; 
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) 
    { 
     if (!placemarks) { 
      // handle error 
     } 

     if(placemarks && placemarks.count > 0) 
     { 
      CLPlacemark *placemark= [placemarks objectAtIndex:0]; 
      NSString *address = [NSString stringWithFormat:@"%@ %@,%@ %@", [placemark subThoroughfare],[placemark thoroughfare],[placemark locality], [placemark administrativeArea]]; 

      // you have the address. 
      // do something with it. 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"MBDidReceiveAddressNotification" 
        object:self 
       userInfo:@{ @"address" : address }]; 
     } 
    }]; 
} 
+0

謝謝!我可以將它存儲在NSuserdefaults中嗎? NSString * valueToSave = address; [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@「address」]; – Brandon

+0

當然,一旦你有了它,你可以做任何你想要的地址。你只需要找到一種方法來告訴你的應用的其他部分你收到了這個地址。請記住,您不知道需要多長時間才能找到地址。它可能在幾毫秒內,或者半分鐘。 –

+0

哦,沒問題。我是否需要告訴appDelegate爲它運行這段代碼?或者它會自動運行? – Brandon