0

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

我正在通过数组在 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]; 
}
4

2 回答 2

1

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

上述假设并不安全,也不推荐。例如,如果地图视图由于用户平移或缩小而需要在重新显示注释后重新显示注释,则绝对可以为同一个注释多次调用委托方法。

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

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

根据您在 中使用的众多数组,一个更好的解决方案calloutAccessoryControlTapped是创建一个适当的类对象来保存所有属性(您的房地产“属性”对象的),然后用一个数组来保存它们(而不是每个属性的单独数组)。

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

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

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

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

于 2012-08-06T19:24:52.593 回答
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
于 2012-07-27T10:23:24.210 回答