Настройка свойств аннотаций вида карты

Я работаю над отображением карты с аннотацией на ней. Что у меня есть до сих пор

Аннотация.h

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

@interface Annotation : NSObject <MKAnnotation> 

@end

MapViewController.m

Annotation *pin = [[Annotation alloc] init];    
[pin title]       = storeName;   
[pin subtitle]    = storeAddress;   
[pin coordinate]  = region.center;       
[mapView addAnnotation:pin];

Однако я получил ошибку, как показано ниже:

выражение нельзя назначить для заголовка, подзаголовка и координаты

У кого-нибудь есть идеи по этому вопросу?


person tranvutuan    schedule 09.02.2012    source источник


Ответы (2)


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

[pin title]       = storeName;   
[pin subtitle]    = storeAddress;   
[pin coordinate]  = region.center;       

Они должны быть такими:

pin.title       = storeName;   
pin.subtitle    = storeAddress;   
pin.coordinate  = region.center;       


Однако протокол MKAnnotation определяет свойства как readonly. Чтобы иметь возможность установить их, объявите их в своем классе Annotation как:

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;

и добавьте для них @synthesize строк в Annotation.m.


Однако, если вам нужны только свойства title, subtitle и coordinate, вам не нужно создавать собственный класс для реализации MKAnnotation. Вместо этого просто используйте встроенный класс MKPointAnnotation, который уже реализует эти свойства как устанавливаемые:

MKPointAnnotation *pin = [[MKPointAnnotation alloc] init];


Другой вариант, как указывает @macbirdie, состоит в том, чтобы просто сделать ваш существующий класс Store (если он у вас есть) реализующим протокол MKAnnotation.

person Community    schedule 09.02.2012
comment
В конце концов, я выбираю MKPointAnnotation. Спасибо за совет - person tranvutuan; 10.02.2012

Просто прочитайте документацию по протоколу MKAnnotation. Вы не должны назначать заголовок, подзаголовок и координаты. Вы должны предоставить реализацию этих методов в своем классе, соответствующую этому протоколу.

Поэтому лучше создать класс StoreAnnotation, который получает storeName, storeAddress и storeCoordinates, или просто класс Store, если он у вас есть, и он будет возвращать соответствующие данные в методах протокола.

person macbirdie    schedule 09.02.2012
comment
но я думаю, что эти переменные являются атрибутом, а не методом, обрядом?... так как мы можем их реализовать - person tranvutuan; 09.02.2012
comment
Это методы, как вы можете видеть в справочнике по протоколу. И вы реализуете их так же, как и любой другой метод экземпляра Objective-C. - person macbirdie; 09.02.2012
comment
Я перешел к протоколу MKAnnotation и нажал «Перейти к», там есть «Свойства» и «Методы экземпляра». В свойствах это заголовок, подзаголовок и координата... - person tranvutuan; 09.02.2012
comment
О, да, извините. Но они только для чтения. Это была общая идея. В дополнение к этим свойствам есть только метод setCoordinate. В любом случае, вы должны реализовать и это. - person macbirdie; 09.02.2012