将街道地址设置为注释中的副标题

时间:2010-12-29 20:51:11

标签: iphone addressbook cllocationmanager mkannotationview mkreversegeocoder

喂!基本上我想反转地理编码我的注释的坐标,并将地址显示为我存储的注释(StorePosition)的副标题。我只是想弄清楚怎么做......我做错了什么?

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

1 个答案:

答案 0 :(得分:3)

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

// ORIGINAL:
首先让我们谈谈你的错误: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放在返回的上方,它仍然没有足够的时间来请求该位置。