注释不会在iOS的MapKit上显示标题/副标题
我正在解析一些具有某些兴趣点的数据,并尝试使用MapKit框架在地图上显示它们. 我为地图上的对象创建了一个自定义类,称为MyLocation.
I am parsing some data with some points of interests and trying to show them on map using the MapKit framework. I created a custom class for my objects on the map which i call MyLocation.
MyLocation.h:
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:
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上执行此操作:
Then on my viewController i do this :
//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];
}
后来,我使用更多代码将图像提供给注释,如果我单击注释,则所有内容都会显示在地图上,但我看不到带有标题和副标题的窗口.我只看到注释,但没有单击它们时应获得的额外信息.
Later i use some more code to give images to the annotations and everything appears on the map BUT if i click on the annotations i dont see the window with the title and the subtitle. I only see the annotations but without the extra information that i should get when i click on them.
我想这行代码有问题:
MyLocation *eventAnnotation = [[MyLocation alloc] initWithName:event.typeEvent address:event.titleEvent coordinate:coordinate] ;
有什么想法吗?
请补充一点,我也使用此功能:
just to add that i also use this function:
- (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;
}
在地图视图中为title
和subtitle
使用自定义getter方法而不是显式设置这些属性是可以的.
Using a custom getter method for the title
and subtitle
instead of setting those properties explicitly is fine with the map view.
未显示标注的原因是title
(正在返回_name
-设置为event.typeEvent
)正在返回nil
或空字符串.
The reason your callouts are not showing is because title
(which is returning _name
-- which is set to event.typeEvent
) is returning a nil
or empty string.
您的getter方法正在检查_name
是否为NSNull
类型,但它可能是NSString
,仍然是nil
或空字符串.
Your getter method is checking if _name
is of type NSNull
but it could be an NSString
and still be nil
or an empty string.
当title
为nil
或为空字符串时,注释将不会显示标注(即使canShowCallout
设置为YES
,即使subtitle
返回非空值)也是如此.
When title
is nil
or an empty string, the annotation will not display the callout (even if canShowCallout
is set to YES
and even if subtitle
is returning a non-empty value).
因此,typeEvent
最有可能是nil
或空字符串.
So it's most likely that typeEvent
is nil
or an empty string.