Выполнение внутренних операций над MKPointAnnotation

Я заполнил несколько мест на MKMapView, используя MKPointAnnotation(s). При нажатии на аннотации я показываю некоторые параметры в меню 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]];
}

person Firdous    schedule 10.05.2012    source источник


Ответы (2)


Похоже, есть два подхода.

Если одновременно можно выбрать только одну аннотацию, вы можете получить доступ к свойству -selectedAnnotations вложенного MKMapView.

Другой подход заключается в проверке sender в showOptions:, который является ссылкой на UIButton, вызвавший действие. Найдите его окружающий MKAnnotationView, который даст вам связанный -annotation. Затем вы можете либо спрятать это как ivar, либо (мой предпочтительный подход) использовать некоторую магию времени выполнения - в форме objc_setAssociatedObject(), объявленной в <objc/runtime.h> - чтобы прикрепить ссылку на аннотацию к листу действий, что позволяет легко найти его в обратном вызове делегата.

(Вы могли бы сделать это еще на этапе создания кнопки, если хотите, и прикрепить ссылку на аннотацию к UIButton, которую можно взять непосредственно в showOptions: и повторно прикрепить к листу действий.

Но [MKMapView selectedAnnotations] я думаю, что это более простой способ, если он соответствует вашим потребностям.

person Conrad Shultz    schedule 10.05.2012
comment
Я использовал selectedAnnotations. Я могу получить заголовок и подзаголовок MKPointAnnotation, но для точного определения должно быть свойство идентификатора, такое как «тег», в других элементах управления, поскольку заголовки и подзаголовки не являются уникальными значениями, потому что я должен внести изменения в базовый массив на основе на этой выбранной аннотации. - person Firdous; 10.05.2012
comment
просто решил это, переопределив класс MKPointAnnotation и добавив к нему свойство ID. Благодарность - person Firdous; 10.05.2012

Вы также можете создать класс, который наследуется от 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];

если у вас есть массив координат, вы можете зацикливать и создавать аннотации.

и вы даже можете настроить вид аннотации по его идентификатору:

-(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;
}
person Oleg Sh.    schedule 03.08.2013