我正在创建一个带有详细披露按钮的MKAnnotationView。
在mapView中:viewForAnnotation:我只是创建一个占位符按钮。
// the right accessory view needs to be a disclosure button ready to bring up the photo
aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
在mapView中:didSelectAnnotationView:我实际创建了一个要使用的按钮(带有相关标签)
// create a button for the callout
UIButton *disclosure = [self.delegate mapController:self buttonForAnnotation:aView.annotation];
NSLog(@"DisclosureButton: %@", disclosure);
// set the button's target for when it is tapped upon
[disclosure addTarget:self.delegate action:@selector(presentAnnotationPhoto:) forControlEvents:UIControlEventTouchUpInside];
// make the button the right callout accessory view
aView.rightCalloutAccessoryView = disclosure;
在日志中,该按钮似乎已完全实例化,并且设置了正确的标记。
这是按钮创建者:
/**
* returns an button for a specific annotation
*
* @param sender the map controller which is sending this method to us (its' delegate)
* @param annotation the annotation we need to create a button for
*/
- (UIButton *)mapController:(MapController *) sender
buttonForAnnotation:(id <MKAnnotation>) annotation
{
// get the annotation as a flickr photo annotation
FlickrPhotoAnnotation *fpa = (FlickrPhotoAnnotation *)annotation;
// create a disclosure button used for showing photo in callout
UIButton *disclosureButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
// associate the correct photo with the button
disclosureButton.tag = [self.photoList indexOfObject:fpa.photo];
return disclosureButton;
}
选择注释时会出现问题。选择注释并点击详细信息披露按钮几秒钟后,没有任何反应。然而,在点击并返回注释几次并测试按钮后,它最终会按预期工作。
奇怪的延迟是怎么回事?有时当按钮开始工作时,它就会显示为alpha设置为0.0,直到你点击它并显示它。
严重的是我遇到的一个更奇怪的问题。
答案 0 :(得分:2)
在调用didSelectAnnotationView
委托方法之前,地图视图已根据注释视图的属性(在更改之前)准备了标注视图。
因此,您在第一次点击时看到的标注没有应用在didSelectAnnotationView
中所做的更改。在下面的点击中,标注可以基于从上一次点击设置的值(这实际上取决于在viewForAnnotation
中如何处理注释视图的重复使用。)
代码在didSelectAnnotationView
和buttonForAnnotation
中执行的唯一操作就是设置按钮操作和标记。
我假设您正在使用“标记”方法,因为presentAnnotationPhoto:
方法需要引用所选注释的属性。
您无需使用标记来获取操作方法中的选定注释。相反,有几个更好的选择:
selectedAnnotations
属性中获取所选注释。有关如何执行此操作的示例,请参阅this question。calloutAccessoryControlTapped
而不是自定义操作方法。委托方法传递对注释视图的引用,该注释视图包含指向其注释的属性(即。view.annotation
),因此没有猜测,搜索或询问选择了什么注释。我推荐这个选项。在第一个选项中,执行addTarget
中的viewForAnnotation
,而不必费心设置tag
。您也不需要buttonForAnnotation
方法。然后在按钮操作方法中,从mapView.selectedAnnotations
获取选定的注释。
目前,您的操作方法位于self.delegate
,因此您可能无法从其他控制器访问地图视图。您可以做的是 在地图控制器中创建一个本地按钮操作方法 ,它获取所选注释,然后调用presentAnnotationPhoto:
self.delegate
上的操作方法(现在可以编写该方法以接受注释参数而不是按钮点击处理程序)。
第二个选项类似,但您不需要执行任何addTarget
,并且在calloutAccessoryControlTapped
方法中,请在presentAnnotationPhoto:
上调用self.delegate
。
对于这两个选项,我建议修改presentAnnotationPhoto:
方法以接受注释对象本身(FlickrPhotoAnnotation *
)而不是当前UIButton *
,并在地图控制器中执行addTarget方法 local 到地图控制器(或使用calloutAccessoryControlTapped),并从该方法手动调用presentAnnotationPhoto:
并将注释传递给它。