2010-02-03 9 views
1

Hé les gars! J'ai quelques problèmes avec un MKAnnotationViewView une image au lieu d'une vue de broche. En d'autres termes, j'ai du mal à afficher une image cible (target.png) à la place de la vue normale. Voici mon code ---Je ne suis pas en mesure de donner une MKAnnotation une image!


// .h file 
#import //Here it says to import mapkit & UIKit. The code blockquote doesn't let me 
#import //show you that 

@interface AddressAnnotation : NSObject { 
    CLLocationCoordinate2D coordinate; 

    NSString *mTitle; 
    NSString *mSubTitle; 
} 

@end 

@interface ChosenLocationMap : UIViewController { 
IBOutlet MKMapView *mapView; 
AddressAnnotation *addAnnotation; 
} 
-(CLLocationCoordinate2D) addressLocation; 

// .m file 
@implementation AddressAnnotation 
@synthesize coordinate; 

- (NSString *)subtitle{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSString *stitle = [prefs objectForKey:@"addressKey"]; 
    return @"%@",stitle; 
} 

- (NSString *)title{ 
    return @"TARGET"; 
} 

-(id)initWithCoordinate:(CLLocationCoordinate2D) c{ 
    coordinate=c; 
    NSLog(@"%f,%f",c.latitude,c.longitude); 
    return self; 
} 

@end 


@implementation ChosenLocationMap 
@synthesize destinationLabel, startbutton, accelloop, aimview, bombblowupview, bombleftview1, bombleftview2, bombleftview3, firebutton; 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 
- (void)viewDidLoad { 
mapView.mapType = MKMapTypeSatellite; 
MKCoordinateSpan span; 
    span.latitudeDelta=0.2; 
    span.longitudeDelta=0.2; 
CLLocationCoordinate2D location = [self addressLocation]; 
region.span=span; 
    region.center=location; 
if(addAnnotation != nil) { 
     [mapView removeAnnotation:addAnnotation]; 
     [addAnnotation release]; 
     addAnnotation = nil; 
    } 
addAnnotation = [[AddressAnnotation alloc] initWithCoordinate:location]; 
    [mapView addAnnotation:addAnnotation]; 
[super viewDidLoad]; 
} 
-(CLLocationCoordinate2D) addressLocation { 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSString *destinationstring = [prefs objectForKey:@"addressKey"]; 
    NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv", 
          [destinationstring stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString]]; 
    NSArray *listItems = [locationString componentsSeparatedByString:@","]; 

    double latitude = 0.0; 
    double longitude = 0.0; 

    if([listItems count] >= 4 && [[listItems objectAtIndex:0] isEqualToString:@"200"]) { 
     latitude = [[listItems objectAtIndex:2] doubleValue]; 
     longitude = [[listItems objectAtIndex:3] doubleValue]; 
    } 
    else { 
     //Show error 
    } 
    CLLocationCoordinate2D location; 
    location.latitude = latitude; 
    location.longitude = longitude; 

    return location; 
} 

- (MKAnnotationView *)map:(MKMapView *)map viewForAnnotation:(id)annotation{ 
    MKAnnotationView *annView; 
    annView = (MKAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:annotation.title]; 

    if(annView == nil) 
     annView = [[[MKAnnotationView alloc] 
        initWithAnnotation:annotation reuseIdentifier:annotation.title] autorelease]; 
    else 
     annView.annotation = annotation; 


    [annView setImage:[UIImage imageNamed:@"target.png"]]; 
    annView.canShowCallout = TRUE; 

    return annView; 
} 

Veuillez noter que je n'ai inclus que le code qui implique réellement la carte. Merci d'avance!

EDIT: J'ai modifié le code dans mon document Xcode pour les changements dans la réponse 1. Je suis trop paresseux pour tout transférer dans le bloc de code ci-dessus, et encore, l'image ne fonctionne toujours pas.

SHOOP DA EDIT: Merci d'avoir répondu! Ma solution était que j'ai oublié de dire mapView.delegate = self. Au revoir!

+0

J'ai eu exactement le même problème - en oubliant de définir le délégué. voter pour avoir le même problème! – Andrew

Répondre

1

Wow tellement de mal avec ce code :-)

D'abord, vous manquez une déclaration @property dans votre AddressAnnotation

@property (nonatomic,assign) CLLocationCoordinate2D coordinate; 

Dans la méthode de sous-titre vous faites ceci:

return @"%@",stitle; 

Mais ceci est Objective-C et pas Python, donc vous pourriez vouloir changer cela en:

return stitle; 

Votre initWithCoordinate est complètement faux. Vous n'initialisez pas super. Cela vaut mieux:

-(id) initWithCoordinate: (CLLocationCoordinate2D) c 
{ 
    if ((self = [super init]) != nil) { 
     coordinate=c; 
     NSLog(@"%f,%f",c.latitude,c.longitude); 
    } 
    return self; 
} 

Essayez fixation ce genre de choses d'abord pour voir si elle aide :-)

+0

Lol! Je ne peux pas croire ça! La chose la plus ironique est que j'ai littéralement copié et collé le code d'un tutoriel. – Flafla2

+0

Encore que, cela n'a pas fait l'affaire ... – Flafla2

0

Je suis nouveau à l'objectif C mais je pense que le prototype de votre fonction de délégué doit être:

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id)annotation{ 
    MKAnnotationView *annView; 

Le nom du délégué est Mapview: viewForAnnotation :, pas carte: viewForAnnotation:

+0

Merci pour la réponse! Eh bien, il ne doit pas nécessairement être mapView, car ce qu'il fait dans cette action est créant une vue d'annotation. Cela peut être tout ce que vous voulez (le nom). – Flafla2

+0

Non, je veux dire le nom du délégué pas le nom de la variable. La vue d'annotation est créée dans une fonction déléguée appelée par l'infrastructure. Je suis sûr que votre nom de délégué est faux "map: viewForAnnotation:" au lieu de "mapView: viewForAnnotation:". Si j'ai raison, votre fonction n'est jamais appelée. C'est pourquoi vous vous retrouvez avec la vue d'annotation par défaut. Avez-vous essayé de définir un point d'arrêt sur la ligne suivante: "if (annView == nil)". – FKDev

0

Aussi AddressAnnotation n'implémente pas le protocole MKAnnotation