我有一个带引脚的地图视图,当用户选择一个引脚时,它会转到该引脚的详细信息屏幕。我还有一个表视图,当用户选择一个项目时,它会转到相同的类型详细信息视图。
我在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];
}
答案 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