Добавление информации о городе и штате в MKAnnotation с помощью CLGeocoder - PullRequest
0 голосов
/ 23 декабря 2011

Я пытаюсь добавить информацию о городе и штате в MKAnnotation, но данные очищаются, прежде чем я смогу добавить их в аннотацию.Вот мой текущий код (показаны только части / части, представляющие интерес для простоты):

в реализации:

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation
{     
    CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
    CLPlacemark *placemark = [placemarks objectAtIndex:0];
    [self setCity:[placemark locality] andState:[placemark administrativeArea]];
    }];

    NSLog(@"Location 1: %@, %@", city, state);

    MapPoint *mp = [[MapPoint alloc] initWithCoordinate:[newLocation coordinate]
                                                  title:[locationTitleField text]
                                                   date:[dateFormat stringFromDate:today]];

    [mapView addAnnotation:mp];
}

- (void)setCity:(NSString *)c andState:(NSString *)s
{
    [self setCity:c];
    [city retain];
    [self setState:s];
    [state retain];
    NSLog(@"Location 2: %@, %@", city, state);
}

в интерфейсе:

@interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate, MKMapViewDelegate>
{
    CLLocationManager *locationManager;
    IBOutlet MKMapView *mapView;
    NSString *city;
    NSString *state;
}

@property (strong, nonatomic) IBOutlet UIWindow *window;
@property (nonatomic, copy) NSString *city;
@property (nonatomic, copy) NSString *state;

- (void)setCity:(NSString *)c andState:(NSString *)s;

@end

Местоположение 1печатает (null), (null), а Location 2 печатает San Francisco, California.Почему данные стираются из этих свойств, прежде чем я смогу использовать их в своей аннотации?

Большое спасибо ...

1 Ответ

1 голос
/ 23 декабря 2011

Причина, по которой местоположение 1 является нулевым, заключается в том, что обратный геокодер не завершил работу при запуске.Все в вашем completionHandler произойдет после того, как геокодер завершит работу.Оператор журнала для местоположения 1 не является частью этого completionHandler и выполняется сразу после вызова обратного геокода.Конечным результатом является то, что вызов журнала происходит до , когда вы звоните setCity:andState:.

Обновление

Вам необходимо установить аннотацию в completionHandler блок.Код, который появляется в блоке, появляется позже в последовательности и времени, чем остальная часть вашей реализации сообщения locationManager:didUpdateToLocation:fromLocation:.Вы можете прочитать о блоках из документации Apple или выполнить поиск в Интернете.

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation
{     
    CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
        CLPlacemark *placemark = [placemarks objectAtIndex:0];
        [self setCity:[placemark locality] andState:[placemark administrativeArea]];
        MapPoint *mp = [[MapPoint alloc] initWithCoordinate:[newLocation coordinate]
                                                      title:[locationTitleField text]
                                                       date:[dateFormat stringFromDate:today]];
        [mapView addAnnotation:mp];
    }];
}

Окончание обновления

Кроме того, это выглядит так, как будтоВы можете использовать свойства не так хорошо, как могли бы.Поскольку у вас есть свойства city и state, вам не нужны переменные экземпляра city и state.

Попробуйте изменить его следующим образом:

@interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate, MKMapViewDelegate>
{
    CLLocationManager *locationManager;
    IBOutlet MKMapView *mapView;
}

В реализации:

@synthesize city, state
...
- (void)setCity:(NSString *)c andState:(NSString *)s
{
    [self setCity:c];
    [self setState:s];
    NSLog(@"Location 2: %@, %@", city, state);
}

Вам не понадобятся дополнительные операторы retain, поскольку свойство копирует значение.Вы также должны обязательно позвонить self.city и self.state, чтобы получить значения.

...