Menetapkan alamat jalan sebagai subtitle dalam anotasi

Hai! Pada dasarnya saya ingin membalikkan geocode koordinat saya untuk anotasi saya dan menampilkan alamat sebagai subtitle untuk anotasi yang saya simpan (StorePosition). Saya tidak tahu bagaimana melakukannya... apa yang saya lakukan salah?

SUNTING; .M

    -(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 sumber


Jawaban (1)


//EDIT2: mungkin itu menyelesaikan masalah Anda, terapkan penyetel koordinat Anda sendiri dan minta geocoder terbalik Anda di sana:

-(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"];
}

// ASLI:
Pertama mari kita bicara tentang bug Anda :D

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

%f adalah untuk nilai float, sehingga tidak akan menampilkan string.
Hal kedua, variabel Anda streetAddress tidak ada saat ini, Anda harus membuatnya dapat diakses dengan menuliskannya di file header Anda.

Kemudian di initWithCoordinate: Anda memanggil return self; semua hal setelah saluran ini tidak pernah dipanggil. Jadi ReverseGeocoder Anda tidak pernah dimulai.

NSString *streetAddress = …

Di sini Anda ingin menyimpan alamat Anda tetapi Anda hanya menuliskannya ke dalam variabel yang hanya ada dalam metode ini. Setelah metode selesai, variabel ini akan dirilis. Anda akan menyimpannya ke variabel luas kelas Anda jika Anda telah mendefinisikannya di file header Anda.

Sekarang mari kita bicara tentang cara bagaimana Anda bisa melakukan itu. Apa yang akan saya lakukan adalah mengeluarkan geocoder terbalik dari anotasi Anda dan meletakkannya di pengontrol mapView Anda. Kemudian jika Anda mendapatkan lokasi baru, Anda mengubah subtitle anotasi Anda.

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

//EDIT: Anda dapat mencatat didFailWith Anda dan Anda akan melihat bahwa dia tidak dapat meminta posisi tersebut. Meskipun Anda meletakkan reverseGeocoder-init di atas return, waktu untuk meminta lokasi masih belum cukup.

person Community    schedule 29.12.2010
comment
Silakan lihat hasil editnya! :D Saya juga tidak mengerti bagaimana seharusnya melakukannya untuk StorePosition! - person Krismutt; 30.12.2010
comment
Self.coordinate=coor; tidak akan berfungsi jika hanya baca, jadi Anda menghapus self (tetapi lokasi init tidak akan di-geocode) ATAU Anda menimpanya dengan readwrite di @interface di atas @implementation Anda (dalam file .m Anda) - person ; 30.12.2010
comment
Saya mendapatkan dua kesalahan pembuatan: 'subjudul' tidak dideklarasikan (penggunaan pertama dalam fungsi ini) dan objek tidak dapat disetel - baik properti hanya baca atau penyetel tidak ditemukan... saya benar-benar pemula.. tolong bantuz - person Krismutt; 30.12.2010
comment
di file header Anda: @property (nonatomic, copy) NSString *subtitle; @property (nonatomic, readwrite) koordinat CLLocationCoordinate2D; - person ; 30.12.2010
comment
Potensi kebocoran di: MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:koor]; geocoder.delegate = mandiri; koordinat = koor; - person Krismutt; 30.12.2010
comment
letakkan autorelease] setelah initWithCoordinate - person ; 30.12.2010
comment
buat properti penahan untuk geocoder, lalu Anda akan menulis self.geocoder = ... dan melepaskannya nanti (di dealloc) - person Felix; 30.12.2010
comment
Itu lebih baik. Saya ingin menyimpan subtitle ini ketika aplikasi ditutup.... tahukah Anda bagaimana saya harus menerapkannya?? - person Krismutt; 30.12.2010
comment
ayolah, saya tidak bisa menulis Aplikasi lengkap Anda. Anda dapat menyimpannya menggunakan CoreData atau file plist untuk menyebutkan beberapa dari banyak kemungkinan. Mulailah membaca dokumentasi atau tinjau beberapa contoh proyek;) - person ; 30.12.2010