Получение объекта из выбора пина

Я использую массив Locations (хранится в сети), которые имеют LocationID, lat, long, name, PinNumber и UserId.

Шаги: Я загружаю полный массив местоположений выбранного пользователя, я создаю контакты с этим массивом (простой цикл for, который использует имя, местоположение и т. Д.)

К сожалению, MKPointAnnotation может иметь только имя и координаты, и именно здесь возникают мои проблемы.

Когда мой пользователь выбирает пин-код и использует аннотацию (поправьте меня, если я ошибаюсь, это маленькая информационная кнопка внутри выбранного булавки), он перенаправляется на другую страницу, где он может редактировать это местоположение, и я не могу найти это в базе данных, потому что я не могу получить идентификатор местоположения.

Я пытался с помощью NSInteger index = [mapView.annotations indexOfObject:view.annotation]; и проверьте этот индекс в моем массиве местоположений, но он просто не совпадает.

Что я могу сделать, чтобы вернуть свой предмет из этой булавки? Или любой обходной путь, который действительно делает работу.

2 ответа

Решение

Вы можете создать подкласс MKAnnotation и добавить к нему свой идентификатор объекта следующим образом:

В CustomAnnotation.h,

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface CustomAnnotation : NSObject <MKAnnotation>

@property (nonatomic, retain) NSString *title;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, retain) NSNumber *objectID;

- (id)initWithTitle:(NSString *)newTitle id:(NSNumber *)objectID location:(CLLocationCoordinate2D)location;
- (MKAnnotationView *)annotationView;
@end

В CustomAnnotation.m,

#import "CustomAnnotation.h"

@implementation CustomAnnotation

- (id)initWithTitle:(NSString *)newTitle id:(NSNumber *)objectID location:(CLLocationCoordinate2D)location
{
    self = [super init];
    if(self)
    {
        // Initialization code
        _title = newTitle;
        _coordinate = location;
        _objectID = objectID;
    }
    return self;
}

- (MKAnnotationView *)annotationView
{
    MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:self reuseIdentifier:@"MyCustomAnnotation"];

    // Your settings
    annotationView.draggable = NO;
    annotationView.enabled = YES;

    return annotationView;
}
@end

Также в mapView:viewForAnnotation:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    // Customise all annotations except MKUserLocation
    if([annotation isKindOfClass:[CustomAnnotation class]])
    {
        CustomAnnotation *point = (CustomAnnotation *)annotation;
        MKAnnotationView *pointView = (MKAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"MyCustomAnnotation"];

        if(pointView == nil)
            pointView = point.annotationView;
        else
            pointView.annotation = annotation;

        ...
        // do something with point.objectID

        return pointView;
    }
    else
        return nil;
}

Вы можете создать подкласс MKPointAnnotation и создать новое свойство с вашим объектом

@interface CustomPointAnnotation : MKPointAnnotation

@property (nonatomic, strong) CustomObject* object;

@end

Теперь, когда вы работаете с , приведите его к CustomPointAnnotation* и установите / получите свойство объекта.

Другие вопросы по тегам