注释在 MapKit 和 iOS 上不显示标题/副标题 [英] Annotations dont show title/subtitle on MapKit , iOS
问题描述
我正在解析一些具有某些兴趣点的数据,并尝试使用 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.
这篇关于注释在 MapKit 和 iOS 上不显示标题/副标题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!