Хранить данные в 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, из которой я могу отправить ее другим методам, которые могут получить доступ этот объект для подробных представлений и т. д.

4 Solutions collect form web for “Хранить данные в MKAnnotation?”

В методе 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 { 
  • Каковы детали «Objective-C Literals», упомянутые в примечаниях к выпуску Xcode 4.4?
  • Преобразование NSArray в NSString в Objective-C
  • В чем разница между наследованием и категориями в Objective-C
  • Как перебирать NSArray?
  • недопустимый контекст 0x0 под iOS 7.0 и деgradleация системы
  • Безопасность NSMutableDictionary
  • Почему моя слабая ссылка не устранена сразу после того, как сильные исчезли?
  • Почему переименовать синтезированные свойства в iOS с ведущими подчеркиваниями?
  • objective C Интроспекция / reflection
  • Xcode 6 и Embedded Frameworks поддерживаются только в iOS8
  • Причина использования ivars против свойств в объекте c
  • Interesting Posts

    Оптимизация Windows 7 для SSD

    Обновление от Ansi до Unicode версии Inno Setup (любые недостатки)

    Как отправлять электронную почту в определенное время (а не просто задержка) в Outlook 2010 или другом почтовом клиенте

    Временное изменение свойств консоли в Windows 7

    Переход в альбомный режим в Android Emulator

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

    Как восстановить данные с мертвого диска?

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

    Rails: вызов другого действия controllerа с controllerа

    Как сохранить работу после выхода из системы?

    Что делает мой трэш диска в Windows XP?

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

    Как написать скрипт для sudo последней команды

    Что такое AsyncCallback?

    Sshfs с пересылкой x?

    Давайте будем гением компьютера.