无法在MKPinAnnotationView上设置标题

时间:2012-10-15 23:11:28

标签: ios mapkit mkannotation

我已经按照本教程: http://www.shawngrimes.me/2011/04/custom-map-pins-for-mapkit/#comment-193

但我无法添加标题和说明

(请参阅我的代码http://pastebin.com/03mDLc9q

2 个答案:

答案 0 :(得分:3)

您正在尝试将名称和说明设置为注释视图的属性,您应该在注释对象上使用titlesubtitle - MyAnnotationClass,注释视图将使用标题渲染标注时该对象的副标题和字幕。

我将您的代码更改为:http://pastebin.com/YRGYhQev

@interface MyAnnotationClass : NSObject<MKAnnotation>

@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *subtitle;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

-(id) initWithCoordinate:(CLLocationCoordinate2D) coordinate;

@end


MyAnnotationClass.m

#import "MyAnnotationClass.h"

@implementation MyAnnotationClass

-(id) initWithCoordinate:(CLLocationCoordinate2D) coordinate{
    self=[super init];
    if(self){
        _coordinate = coordinate;
    }
    return self;
}

-(void) dealloc{
    [_title release];
    [_subtitle release];
    [super dealloc];
}
@end


ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface ViewController : UIViewController<MKMapViewDelegate> {
    IBOutlet MKMapView *_myMapView;
    NSArray *_myAnnotations;
}

@property (nonatomic, retain) NSArray *myAnnotations;
@property (nonatomic, retain) IBOutlet MKMapView *myMapView;

@end


ViewController.m

#import "ViewController.h"
#import "AppDelegate.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
#import "PlaceMark.h"  
#import "MyAnnotationClass.h"
@interface ViewController ()

@end

@implementation ViewController
@synthesize myMapView = _myMapView;
@synthesize myAnnotations = _myAnnotations;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

-(void) viewDidLoad{
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];

    //Initialize annotation
    MyAnnotationClass *commuterLotAnnotation=[[MyAnnotationClass alloc] initWithCoordinate:CLLocationCoordinate2DMake(appDelegate.latitude , appDelegate.longitude)];
    commuterLotAnnotation.title = @"Hello title";
    commuterLotAnnotation.subtitle = @"Correct";

    MyAnnotationClass *overflowLotAnnotation=[[MyAnnotationClass alloc] initWithCoordinate:CLLocationCoordinate2DMake(appDelegate.latitude , appDelegate.longitude)];
    overflowLotAnnotation.title = @"Hello title";
    overflowLotAnnotation.subtitle = @"Correct";

    //Add them to array
    self.myAnnotations=[NSArray arrayWithObjects:commuterLotAnnotation, overflowLotAnnotation, nil];

    //Release the annotations now that they've been added to the array
    [commuterLotAnnotation release];
    [overflowLotAnnotation release];

    //add array of annotations to map
    [_myMapView addAnnotations:_myAnnotations];
}


-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation{
    static NSString *parkingAnnotationIdentifier=@"ParkingAnnotationIdentifier";

    if([annotation isKindOfClass:[MyAnnotationClass class]]){
        //Try to get an unused annotation, similar to uitableviewcells
        MKAnnotationView *annotationView=[_myMapView dequeueReusableAnnotationViewWithIdentifier:parkingAnnotationIdentifier];

        //If one isn't available, create a new one
        if(!annotationView){
            annotationView=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:parkingAnnotationIdentifier];
            //Here's where the magic happens
            annotationView.image=[UIImage imageNamed:@"apple.gif"];
            annotationView.canShowCallout = YES;
        }
        return annotationView;
    }
    return nil;
}


- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


@end

答案 1 :(得分:1)

我看到教程的MyAnnotationClass界面为:

@interface MyAnnotationClass : NSObject

当我使用MKAnnotation时,我将注释界面设置为:

@interface MyAnnotationClass : MKAnnotationView <MKAnnotation> 

然后在MyAnnotationClass.m文件中,我有以下方法:

- (NSString *)title{
    return self.name;
}

- (NSString *)subtitle{
    return self.description;
}