Установка почтового адреса в качестве подзаголовка в аннотации

Привет! По сути, я хочу изменить геокодирование своих координат для моей аннотации и показать адрес в качестве подзаголовка для моей сохраненной аннотации (StorePosition). Я просто не могу понять, как это сделать... что я делаю не так?

РЕДАКТИРОВАТЬ; м

    -(NSString *)subtitle{          
 return subtitle;

    - (void)setCoordinate:(CLLocationCoordinate2D)c {
        MKReverseGeocoder *rvg = [[MKReverseGeocoder alloc] initWithCoordinate:c];
        rvg.delegate = self;
        [rvg start];
        coordinate = c;
    }

    - (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
        self.subtitle = [placemark.addressDictionary valueForKey:@"Street"]; 
    } 

person Krismutt    schedule 29.12.2010    source источник


Ответы (1)


//EDIT2: возможно, это решит вашу проблему, реализуйте свой собственный установщик координат и запросите там свой обратный геокодер:

-(NSString *)subtitle{
    if (!subtitle) {
        return @"No Street";
    } else {
        return subtitle;
    }
}

-(NSString *)title{
    return @"Saved position";
}

- (void)setCoordinate:(CLLocationCoordinate2D)c {
    MKReverseGeocoder *rvg = [[MKReverseGeocoder alloc] initWithCoordinate:c];
    rvg.delegate = self;
    [rvg start];
    coordinate = c;
}


-(id)initWithCoordinate:(CLLocationCoordinate2D) coor{
    self.coordinate=coor;
    NSLog(@"%f,%f",coor.latitude,coor.longitude);
    return self;
}

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
    NSLog(@"fail %@", error);
}

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
    self.subtitle = [placemark.addressDictionary valueForKey:@"Street"];
}

// ОРИГИНАЛ:
Давайте сначала поговорим о ваших ошибках :D

return [NSString stringWithFormat:@"%f", streetAddress];

%f предназначен для значений с плавающей запятой, поэтому он не будет отображать строку.
Во-вторых, ваша переменная streetAddress в настоящее время не существует, вы должны сделать ее доступной, написав ее в файле заголовка.

Затем в initWithCoordinate: вы вызываете return self; все, что после этой строки никогда не вызывается. Так что ваш ReverseGeocoder никогда не заводится.

NSString *streetAddress = …

Здесь вы хотите сохранить свой адрес, но записываете его только в переменную, которая существует только в этом методе. После выполнения метода эта переменная будет освобождена. Вы бы сохранили его в переменной вашего класса, если бы вы определили его в своем заголовочном файле.

Теперь давайте поговорим о том, как вы можете это сделать. Что бы я сделал, так это удалил обратный геокодер из вашей аннотации и поместил его в ваш контроллер mapView. Затем, если вы получаете новое местоположение, вы меняете подзаголовок своей аннотации.

[[mapView.annotations objectAtIndex:0] setSubtitle:@"Address Information"];

// РЕДАКТИРОВАТЬ: вы можете зарегистрировать свой didFailWith, и вы увидите, что он не может запросить позицию. Даже если вы поместите свой reverseGeocoder-init выше возврата, у него все еще недостаточно времени, чтобы запросить местоположение.

person Community    schedule 29.12.2010
comment
Пожалуйста, взгляните на редактирование! :D Я не понимаю, как я должен сделать это и для StorePosition! - person Krismutt; 30.12.2010
comment
self.coordinate=coor; не будет работать, если он доступен только для чтения, поэтому либо вы удаляете себя (но тогда местоположение инициализации не будет геокодировано), либо вы перезаписываете его с помощью readwrite в @interface над вашей @implementation (в вашем .m файле) - person ; 30.12.2010
comment
Я получаю две ошибки сборки: «подзаголовок» не объявлен (первое использование в этой функции), и объект не может быть установлен - либо свойство только для чтения, либо установщик не найден... я настоящий новичок.. пожалуйста, помогите - person Krismutt; 30.12.2010
comment
в вашем заголовочном файле: @property (nonatomic, copy) NSString *subtitle; @property (неатомарное, для чтения и записи) Координата CLLocationCoordinate2D; - person ; 30.12.2010
comment
Потенциальная утечка: MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:koor]; geocoder.delegate = сам; координата = коор; - person Krismutt; 30.12.2010
comment
поставить авторелиз] после initWithCoordinate - person ; 30.12.2010
comment
создайте свойство сохранения для геокодера, тогда вы должны написать self.geocoder = ... и выпустить его позже (в Dealloc) - person Felix; 30.12.2010
comment
Так-то лучше. Я хочу сохранить этот субтитр, когда приложение закроется... знаете, как мне это реализовать?? - person Krismutt; 30.12.2010
comment
да ладно, я не могу написать ваше полное приложение. Вы можете сохранить его, используя CoreData или файл plist, чтобы назвать лишь некоторые из многих возможностей. Начните читать документацию или просмотрите несколько примеров проектов ;) - person ; 30.12.2010