Хранить данные в MKAnnotation? - PullRequest
15 голосов
/ 09 мая 2011

Так что я довольно новичок в Xcode и Objective-C.У меня есть несколько объектов ArtPiece с различными атрибутами, хранящимися в массиве.Затем я добавляю их как MKAnnotations в представление карты.Что мне нужно сделать, это отправить ссылку на позицию массива, откуда они пришли, по клику.Я считаю, что MKAnnotations имеют только заголовок, изображение и местоположение членов данных, поэтому, когда я делаю MKAnnotation из объектов, аннотация не сохраняет никаких других атрибутов.Итак, мой вопрос: как мне сохранить ссылку на позицию массива объекта, из которого была создана аннотация, чтобы я мог отправить его другим методам, чтобы они могли получить дополнительную информацию об объекте из массива для получения подробной информации?представления и т. д. Есть ли способ сохранить одно значение int в аннотации?Я не думаю, что есть какие-либо другие идеи?

Вот мой ArtPiece.h:

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface ArtPiece : NSObject <MKAnnotation>{

    NSString *title;
    NSString *artist;
    NSString *series;
    NSString *description;
    NSString *location;
    NSString *area;
    NSNumber *latitude;
    NSNumber *longitude;
    UIImage *image;
}

@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *artist;
@property (nonatomic, retain) NSString *series;
@property (nonatomic, retain) NSString *description;
@property (nonatomic, retain) NSString *location;
@property (nonatomic, retain) NSString *area;
@property (nonatomic, retain) NSNumber *latitude;
@property (nonatomic, retain) NSNumber *longitude;
@property (nonatomic, retain) UIImage *image;


@end

, а вот .m:

#import "ArtPiece.h"
#import "FindArtController.h"
#import "ArtPiece.h"
#import <MapKit/MapKit.h>

@implementation ArtPiece

- (NSString *)description{
    return [NSString stringWithFormat:@"title: %@",title];
}

@synthesize title, artist, series, description, latitude, longitude, location, area, image;

- (CLLocationCoordinate2D)coordinate
{
    CLLocationCoordinate2D theCoordinate;
    theCoordinate.latitude = [self.latitude doubleValue];
    theCoordinate.longitude = [self.longitude doubleValue];
    return theCoordinate;
}




@end

Затем я продолжаю создавать объекты этого класса, устанавливать их значения и добавлять их в массив в AppDelegate.Затем в другом классе я использую:

[self.mapView addAnnotations:mainDelegate.mapAnnotations];

, чтобы добавить аннотации на карту.Однако, когда я пытаюсь установить атрибут «Artist» в методе viewforannotation, я получаю «запрос на художника Artist в чем-то, что не является структурой или объединением».

Очевидно, я, должно быть, неправильно делаю эту подклассу, но что я могу изменить?

Вот метод viewforannotation, который у меня есть сейчас.Строка test.artist ... не работает.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
    MKAnnotationView *test=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"reuse"];
    test.image = [UIImage imageNamed:@"pao_pin.png"];
    [test setCanShowCallout:YES];
    [test setUserInteractionEnabled:YES];
    test.rightCalloutAccessoryView =
    [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    test.artist = annotation.artist;
    return test;    
}

Итак, я должен: annotation = (ArtPiece *)annotation Короче говоря, моя цель - сохранить ссылку на позицию массива объекта вэта аннотация была сделана так, чтобы я мог отправить ее другим методам, которые могут получить доступ к этому объекту для подробных видов и т. д.

Ответы [ 4 ]

19 голосов
/ 09 мая 2011

В методе viewForAnnotation вы можете получить доступ к своим свойствам ArtPiece, но чтобы избежать ошибок и предупреждений компилятора, вам сначала нужно будет привести параметр annotation к вашему пользовательскому классу. Параметр annotation в этом методе просто определен как id<MKAnnotation>, поэтому компилятор не будет знать о специфических для ArtPiece свойствах (пока вы не скажете, что это экземпляр ArtPiece).

Вам понадобится что-то вроде этого:

ArtPiece *artPiece = (ArtPiece *)annotation;
NSString *artist = artPiece.artist;

Изменить:
При нажатии кнопки выноски аннотации в представлении карты вызывается метод делегата calloutAccessoryControlTapped. Этот метод получает MKAnnotationView в параметре view. Сам объект аннотации находится в свойстве annotation параметра view. Вы можете привести этот объект в свой пользовательский класс для доступа к вашим ArtPiece свойствам:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    ArtPiece *artPiece = (ArtPiece *)view.annotation;
    NSString *artist = artPiece.artist;
}

Другими словами, обработчику кнопки выноски не требуется доступ к исходному массиву. Он получает ссылку на сам фактический ArtPiece объект.

1 голос
/ 23 июля 2015

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

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
1 голос
/ 09 мая 2011

Кажется, здесь есть некоторая путаница.

MKAnnotation - это протокол, а не класс, поэтому вы не делите его на подклассы, вы реализуете его.Любой объект может быть MKAnnotation, если он реализует протокол MKAnnotation (координата, заголовок, субтитры), и этот объект может иметь любое другое свойство, которое вам нравится, если вы его создаете.Вы сделали это правильно выше.

Часто вам нужно будет привести это <MKAnnotation> к вашему пользовательскому классу, как сказала Анна Каренина, чтобы сообщить компилятору, какой это тип объекта.

MKAnnotationView с другой стороны, это класс (и подкласс UIView), и если вы хотите создать свой собственный, вы можете создать его подкласс.Затем, когда он создается и используется картой, он содержит ссылку на связанный с ним MKAnnotation, поэтому в вашем пользовательском MKAnnotationView вы можете:

self.artistLabel.text = [(ArtPiece *)self.annotation artist];
1 голос
/ 09 мая 2011

Создайте подкласс MKAnnotation, и вы можете добавить любые дополнительные элементы данных, которые вам нужны.

...