Annotations dont show title/subtitle on MapKit , iOS

荒凉一梦 提交于 2019-12-12 05:38:41

问题


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:

#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

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.

I guess theres something wrong with this line of code :

MyLocation *eventAnnotation = [[MyLocation alloc] initWithName:event.typeEvent address:event.titleEvent coordinate:coordinate] ;

Any ideas?

EDIT

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;    
}

回答1:


Using a custom getter method for the title and subtitle instead of setting those properties explicitly is fine with the map view.

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.

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.

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).

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




回答2:


Looking at your code, you never actually set the title or subtitle attributes. In the place where you set up your title, do something like this:

eventAnnotation.title = event.typeEvent;
eventAnnotation.subtitle = event.titleEvent;

and make sure you have the title and subtitle properties set up in the .h file.

Edit: Here's the header for one of my annotations:

#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



回答3:


Please refer to the Apple doc. you need to set title and subtitle of an annotation object yourself. not some other property like _address instead. There is also 2 sample projects in that doc, check them out as well.



来源:https://stackoverflow.com/questions/11310224/annotations-dont-show-title-subtitle-on-mapkit-ios

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!