0

我使用 MKPointAnnotation(s) 在 MKMapView 上填充了几个位置。在点击注释时,我会使用 UIActionSheet 菜单显示一些选项。这些选项有一些删除功能,当用户点击 UIActionSheet 上的删除选项时,会删除地图上选定的注释。问题是我无法确定单击了哪个注释点,我似乎没有参考它。

添加注解点的代码是:

while(looping array of locations)
{
MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init];
annotationPoint.coordinate = {coord of my location}
annotationPoint.title = [anObject objectForKey:@"castTitle"];
annotationPoint.subtitle = [anObject objectForKey:@"storeName"];

[self.mainMapView addAnnotation:annotationPoint];
}

在点击注释时显示 UIActionSheet 的代码是:

-(MKAnnotationView*)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
    if([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
    MKPinAnnotationView *pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];

    pinView.animatesDrop = YES;
    pinView.canShowCallout = YES;
    pinView.pinColor = [self getAnnotationColor];

    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [rightButton setTitle:annotation.title forState:UIControlStateNormal];
    [rightButton addTarget:self action:@selector(showOptions:) forControlEvents:UIControlEventTouchUpInside];
    pinView.rightCalloutAccessoryView = rightButton;

    return pinView;
}

-(IBAction)showOptions:(id)sender
{
        UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"", @"") delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel") destructiveButtonTitle:nil otherButtonTitles:NSLocalizedString(@"Delete", @"Delete"),      nil];

        [sheet showInView:[self.view window]];
}
4

2 回答 2

3

您还可以创建一个继承自 MKPointAnnotation 的类,并添加一个 id 属性,然后使用您的类:

@interface MyPointAnnotation : MKPointAnnotation 

@property int pointId;

@end

然后在您的视图控制器中使用它:

创建注释:

    MyPointAnnotation *myAnnotation = [[MyPointAnnotation alloc]init];
    myAnnotation.coordinate= someCoordinates;
    [myAnnotation setTitle:@"i am annotation with id"];
    myAnnotation.pointId = 1;
    [self.mapView addAnnotation:myAnnotation];

如果您有一组坐标,则可以循环并创建注释。

您甚至可以通过其 id 自定义注释视图:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{

MKPinAnnotationView *view=(MKPinAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"reuseme"];
  if (!view) {
      view=[[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"reuseme"];
  }


  if (((MyPointAnnotation *)annotation).pointId == 1)
  {
      //the annotation with id 1.
  }
return view;
}
于 2013-08-03T18:56:04.803 回答
2

似乎有两种方法。

如果一次只能选择一个注释,则可以访问-selectedAnnotations封闭的属性MKMapView

另一种方法是检查senderin showOptions:,它是对UIButton触发操作的 的引用。找出它的附件MKAnnotationView,它会给你相关的-annotation。然后,您可以将其作为 ivar 存储,或者(我的首选方法)使用一些运行时魔法 - 以objc_setAssociatedObject()声明的形式<objc/runtime.h>- 将对注释的引用附加到操作表,从而允许在其委托回调中轻松检索。

(如果需要,您实际上可以在按钮创建阶段执行此操作,并将对注释的引用附加到 UIButton,可以直接在操作表中提取showOptions:并重新附加到操作表。

[MKMapView selectedAnnotations]我认为如果它适合您的需求,这是更简单的方法。

于 2012-05-10T08:43:55.993 回答