Хранить данные в MKAnnotation?

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

Вот мой ArtPiece.h:

#import  #import  @interface ArtPiece : NSObject { 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  @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 

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

 [self.mapView addAnnotations:mainDelegate.mapAnnotations]; 

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

Очевидно, что я должен делать это подclassифицирование неправильно, но что я могу изменить?

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

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )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 Короче говоря, моя цель – сохранить ссылку на позицию массива объекта в этой annotations, из которой я могу отправить ее другим методам, которые могут получить доступ этот объект для подробных представлений и т. д.

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

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

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

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

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

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

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

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

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

Зачастую вам нужно будет это к своему пользовательскому classу, как сказала Анна Каренина, чтобы сообщить компилятору, какой тип объекта он есть.

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

 self.artistLabel.text = [(ArtPiece *)self.annotation artist]; 

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

 -(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { 
  • xcode 6 IB_DESIGNABLE - не загружать ресурсы из пакета в построителе интерфейса
  • Удаленное уведомление iOS 8
  • недопустимый контекст 0x0 под iOS 7.0 и деgradleация системы
  • Использование NSString в операторе switch
  • Objective-C - CABasicAnimation, применяющая изменения после анимации?
  • Можно ли использовать несколько (двух) постоянных хранилищ с одной объектной моделью, поддерживая отношения друг от друга?
  • Как я могу сделать свое шифрование AES идентичным между Java и Objective-C (iPhone)?
  • Динамически размер uitableViewCell в соответствии с UILabel (с интервалом между абзацами)
  • Почему моя слабая ссылка не устранена сразу после того, как сильные исчезли?
  • Индекс символов в точке касания для UILabel
  • Зашифрованные NSData для NSString в obj-c?
  • Давайте будем гением компьютера.