我正在使用一些兴趣点解析一些数据,并尝试使用MapKit框架在地图上显示它们。 我在地图上为我的对象创建了一个自定义类,我称之为MyLocation。
MyLocation.h:
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface MyLocation : NSObject <MKAnnotation> {
NSString *_name;
NSString *_address;
NSInteger _eventId;
CLLocationCoordinate2D _coordinate;
NSString *title;
NSString *subtitle;
}
@property (nonatomic , copy) NSString *name;
@property (nonatomic , copy) NSString *address;
@property (nonatomic, assign) NSInteger eventId;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
- (id)initWithName:(NSString*)name address:(NSString*)address coordinate:(CLLocationCoordinate2D)coordinate;
@end
MyLocation.m:
#import "MyLocation.h"
@implementation MyLocation
@synthesize name = _name;
@synthesize eventId=_eventId;
@synthesize address = _address;
@synthesize coordinate = _coordinate;
@synthesize title;
@synthesize subtitle;
- (id)initWithName:(NSString*)name address:(NSString*)address coordinate:(CLLocationCoordinate2D)coordinate {
if ((self = [super init])) {
_name= [name copy];
_address = [address copy];
_coordinate = coordinate;
}
return self;
}
- (NSString *)title {
if ([_name isKindOfClass:[NSNull class]]) {
NSLog(@"11111111");
return @"Unknown charge";
}
else{
NSLog(@"222222");
return _name;
}
}
- (NSString *)subtitle {
NSLog(@"HAHAHAHAA");
return _address;
}
@end
然后在我的viewController上执行此操作:
//showing on map the points of interests that are stored on "eventList"
int i=0;
for (parsedItem *event in self.eventsList) {
CLLocationCoordinate2D coordinate;
coordinate.latitude = event.latitude;
coordinate.longitude = event.longitude;
if(i==0){
//numbers show map zoom. 500,500 = map stretches 500 meters to the North and the South of current location
MKCoordinateRegion region =
MKCoordinateRegionMakeWithDistance (coordinate,1000,1000);
[mapView setRegion:region animated:NO];
}
MyLocation *eventAnnotation = [[MyLocation alloc] initWithName:event.typeEvent address:event.titleEvent coordinate:coordinate] ;
eventAnnotation.name = event.typeEvent;
eventAnnotation.address = event.titleEvent;
eventAnnotation.eventId = i;
i++;
[mapView addAnnotation:eventAnnotation];
}
后来我使用了一些代码来为注释提供图像,一切都出现在地图上但是如果我点击注释我看不到带有标题和副标题的窗口。我只看到注释,但没有我点击它们时应该得到的额外信息。
我猜这段代码有问题:
MyLocation *eventAnnotation = [[MyLocation alloc] initWithName:event.typeEvent address:event.titleEvent coordinate:coordinate] ;
有什么想法吗?
只是添加我也使用此功能:
- (MKAnnotationView *)mapView:(MKMapView *)mapView2 viewForAnnotation:(id <MKAnnotation>)annotation {
static NSString *identifier = @"MyLocation";
if ([annotation isKindOfClass:[MyLocation class]]) {
NSLog(@"I got into the class!!!");
MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (annotationView == nil) {
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
} else {
annotationView.annotation = annotation;
}
annotationView.enabled = YES;
annotationView.canShowCallout = YES;
MyLocation *eventAnnotation=annotation;
if ([eventAnnotation.address isEqualToString: @"Culture_07/02/2012"]) {
NSLog(@"Mphkeeee");
annotationView.image=[UIImage imageNamed:@"culture.png"];
//annotation.title = @"Holla!";
} else if ([eventAnnotation.address isEqualToString: @"Sports_06/29/2012"]) {
annotationView.image=[UIImage imageNamed:@"sports.png"];
} else if ([eventAnnotation.address isEqualToString: @"Accident_06/29/2012"]) {
annotationView.image=[UIImage imageNamed:@"accident.png"];
} else if ([eventAnnotation.address isEqualToString: @"Problem_06/29/2012"]) {
annotationView.image=[UIImage imageNamed:@"problem.png"];
} else if ([eventAnnotation.address isEqualToString: @"Traffic_07/02/2012"]) {
annotationView.image=[UIImage imageNamed:@"traffic.png"];
} else if ([eventAnnotation.address isEqualToString: @"Music_06/29/2012"]) {
annotationView.image=[UIImage imageNamed:@"music.png"];
}
return annotationView;
}
return nil;
}
答案 0 :(得分:1)
使用title
和subtitle
的自定义getter方法,而不是显式设置这些属性,可以使用地图视图。
您的标注未显示的原因是title
(返回_name
- 设置为event.typeEvent
)返回nil
或空字符串。
您的getter方法正在检查_name
是NSNull
类型,但它可能是NSString
,仍然是nil
或空字符串。
当title
为nil
或空字符串时,注释不会显示标注(即使canShowCallout
设置为YES
,即使subtitle
}返回一个非空值。)
因此,typeEvent
最有可能是nil
或空字符串。
答案 1 :(得分:0)
查看代码,您实际上从未设置title
或subtitle
属性。在您设置标题的位置,执行以下操作:
eventAnnotation.title = event.typeEvent;
eventAnnotation.subtitle = event.titleEvent;
并确保您在title
文件中设置了subtitle
和.h
属性。
编辑:以下是我的其中一个注释的标题:
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface MapmarkAnnotation : NSObject
<MKAnnotation>
{
NSString *title;
CLLocationCoordinate2D coordinate;
}
@property (nonatomic, copy) NSString *title;
@property (nonatomic, readwrite) CLLocationCoordinate2D coordinate;
@end
答案 2 :(得分:0)
请参阅Apple文档。您需要自己设置注释对象的标题和副标题。而不是像_address这样的其他属性。该文档中还有2个示例项目,也可以查看它们。