2012-12-17 4 views
0

reverseGeocodeLocation을 사용하여 사용자의 상태를 반환하려고합니다. 이 코드를 사용하여 사용자의 위치를 ​​다른보기에서 가져옵니다. 'NSInvalidArgumentException', 이유 : 나는 다음과 같은 오류를 얻고있다reverseGeocodeLocation NSString으로 저장 됨 오류 발생

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

는 '- [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

당신이 헤더에 함수를 추가 했 : 가장 쉬운

하지만 아마 가장 좋은 방법은하는 NSNotification을 보낼 것입니까? – Misha

+0

내 appDelegate 헤더에이 있습니다 : - (NSString *) getAddressFromLocation; – Brandon

+0

내가 넣어 줄 필요가 있는지 모르겠다 : (CLLocation *) 위치 부분은 – Brandon

답변

1

CLGeocoder 방법 reverseGeocodeLocation:completionHandler:은 비동기 적으로 실행됩니다. 즉,이 메소드에서 반환 할 때 주소가 설정되지 않기 때문에 getAddressFromLocation:에서 주소를 반환 할 수 없습니다.

지오 코더가 주소를 수신하면 (또는 호출이 오류를 일으킨 경우) completionHandler가 실행됩니다. 완성 처리기 내에서 주소를 설정하거나 표시해야합니다.

-(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 = 주소; [[NSUserDefaults standardUserDefaults] setObject : valueToSave forKey : @ "address"]; – Brandon

+0

확실하면 일단 주소가 있으면 원하는대로 할 수 있습니다. 앱의 나머지 부분에 주소를 알려주는 방법을 찾아야합니다. 주소가 발견 될 때까지 소요되는 시간을 모를 수 있습니다. 2 밀리 초 내에 있거나 30 분 정도 걸릴 수 있습니다. –

+0

오, 알았어. 이 코드를 실행하려면 appDelegate에게 뭔가를 말해야합니까? 또는 자동으로 실행됩니까? – Brandon