注释在 MapKit 和 iOS 上不显示标题/副标题 [英] Annotations dont show title/subtitle on MapKit , iOS

查看:30
本文介绍了注释在 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;    
}

推荐答案

titlesubtitle 使用自定义 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.

titlenil或空字符串时,注解不会显示标注(即使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).

所以很可能 typeEventnil 或一个空字符串.

So it's most likely that typeEvent is nil or an empty string.

这篇关于注释在 MapKit 和 iOS 上不显示标题/副标题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆