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

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

推荐答案

在地图视图中为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).

因此,typeEvent最有可能是nil或空字符串.

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

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

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