MKMapView MKAnnotationView问题?

时间:2012-07-27 09:59:05

标签: iphone mkmapview mkannotationview

我有一个带引脚的地图视图,当用户选择一个引脚时,它会转到该引脚的详细信息屏幕。我还有一个表视图,当用户选择一个项目时,它会转到相同的类型详细信息视图。

我在mapview中通过数组添加了多个引脚。我在配件视图中添加了按钮,

这是问题......

当我点击按钮时,引脚选择将他带到不同引脚的详细视图。但是在表格视图中它仍然可以正常工作。任何人都可以帮助我...?

-(MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{
    MKPinAnnotationView *newAnnotation = nil;
    if([annotation.title isEqualToString:@"You are here."])
    {
        newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"greenpin"];
        newAnnotation.pinColor = MKPinAnnotationColorGreen;
    }
    else
    {      
        newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"redpin"];
        newAnnotation.pinColor = MKPinAnnotationColorRed;
        UIButton *pinButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        pinButton.tag = indexvar;
        [newAnnotation addSubview:pinButton];
        newAnnotation.canShowCallout = YES;    
        newAnnotation.rightCalloutAccessoryView = pinButton;
        newAnnotation.calloutOffset = CGPointMake(-5, 5);
        indexvar++;
        return newAnnotation;
        [pinButton release];
    }
    newAnnotation.animatesDrop = YES;
    newAnnotation.canShowCallout = YES;
    return newAnnotation;
}

- (void)mapView:(MKMapView *)wikiMapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{
    NSInteger selectedIndex = ((UIButton *)control).tag;
    NSLog(@"Property Index : %d ",selectedIndex);
    DetailView = [[PropertyDetails alloc] initWithNibName:@"PropertyDetails" bundle:nil];
    DetailView.propertyReference = [PropertyReferenceArr objectAtIndex:selectedIndex];
    DetailView.propertyTitle = [propertyTitlesArr objectAtIndex:selectedIndex];
    DetailView.propertyPrice = [propertyPriceArr objectAtIndex:selectedIndex];
    DetailView.propertyBedrooms = [propertyBedroomsArr objectAtIndex:selectedIndex];
    DetailView.propertyLatitude = [propertyLatitudesArr objectAtIndex:selectedIndex];
    DetailView.propertyLongitude = [propertyLongitudesArr objectAtIndex:selectedIndex];
    DetailView.propertyDefaultImage = [PropertyImageArr objectAtIndex:selectedIndex];
    DetailView.propertyStatusId = [PropertyStatusArr objectAtIndex:selectedIndex];
    [self.navigationController pushViewController:DetailView animated:YES];         
    [DetailView release]; 
}

2 个答案:

答案 0 :(得分:1)

viewForAnnotation中,使用ivar计数器(indexvar设置按钮标记的方式假定委托方法只会被调用一次,并且按照注释的顺序被调用添加(你可能在某个循环中以索引顺序进行)。

上述假设不安全,不推荐。例如,如果地图视图在返回到视图后需要重新显示注释,因为用户平移或缩放,则对于相同的注释,肯定可以多次调用委托方法。

不使用按钮标记,而是将所需信息嵌入到注记类本身中,并在添加注释时设置该信息。

至少(但仍然不推荐),您可以做的是向注释类添加propertyIndex属性并将其设置为等于数组索引(比如PropertyReferenceArr数组)正在创建注释。

基于您在calloutAccessoryControlTapped中使用的众多数组,更好的解决方案是创建一个合适的类对象来保存所有属性(属性&#34;属性&#34;对象)然后有一个数组来保存它们(而不是每个属性的单独数组)。

此类本身可以符合MKAnnotation,因此您不需要创建单独的显式注释对象(您只需将属性对象本身添加到地图中)。

然后在calloutAccessoryControlTapped中,您只需将view.annotation转换为自定义类,即可访问所有注释/属性数据,而无需任何标记或数组索引。

评论@naveen表示您的addSubview行也有效(尽管它与此问题无关)。你绝对应该删除它。

此外,在viewForAnnotation中,[pinButton release];之后调用return毫无意义。该代码永远不会运行(这很好,因为如果你把它放在return之前,应用程序会崩溃,因为pinButton是自动释放的。)

答案 1 :(得分:0)

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{    
    myAnnotation *annView = view.annotation; // myAnnotation is my custom class for annotations
    // now in annView you have the exact annotation whose accessorybutton is clicked now you can do whatever you want with it.
    NSLog(@"title = %@",annView.title);
}

而不是设置按钮标签,您可以使用注释的标题或副标题进行进一步的比较或任何您想要的

在您使用的代码中

[newAnnotation addSubview:pinButton]; // i think this is wrong you should only add it to accessory view