2010-10-19 3 views
2

J'ai lutté avec cela pendant quelques jours, j'ai même réécrit la moitié du code pour l'essayer d'une autre manière. J'ai mes annotations importées d'un csv, et placé sur la carte avec des tuiles et des sous-titres, j'essaye en vain d'ajouter une étiquette aux boutons de divulgation ainsi je peux voir qui a été tapoté, mais ayant des problèmes, quelles que soient les valeurs J'attribue à l'annotation je ne peux pas sembler y accéder (comme l'index) je peux accéder au titre et au sous-titre, mais c'est tout.mapkit, en marquant un bouton de divulgation avec l'index de l'annotation

Comment puis-je attribuer un index à l'annotation que je peux alors ajouter au bouton comme une étiquette, donc je peux enregistrer le robinet

ici est mon code

 NSURL *dataUrl = [NSURL URLWithString:@"http://nne.ezadspro.co.uk/cms/testmap.txt"]; 
    // URLWithString:@"http://neic.usgs.gov/neis/gis/qed.asc"]; 
    NSString *fileString = [NSString stringWithContentsOfURL:dataUrl 
                encoding:NSUTF8StringEncoding 
                 error:nil]; 
    int count = 0; 
    NSScanner *scanner = [NSScanner scannerWithString:fileString]; 

    points = [[NSMutableArray array] retain]; 
    AnnotationData *event; 
    NSString *line; 
    NSArray *values; 
    while ([scanner isAtEnd] == NO) { 
     [scanner scanUpToString:@"\n" intoString:&line]; 
     //skip the first line 
     if(count > 0) { 
      values = [line componentsSeparatedByString:@","]; 
      event = [[[AnnotationData alloc] init] autorelease]; 
      event.latitude = [[values objectAtIndex:5] floatValue]; 
      event.longitude = [[values objectAtIndex:6] floatValue]; 
      event.companyID = [[values objectAtIndex:0]intValue]; 
      event.title = [values objectAtIndex:1]; 
      event.subtitle = [values objectAtIndex:2]; 
      //event.magnitude = [[values objectAtIndex:4] floatValue]; 
      //event.depth = [[values objectAtIndex:5] floatValue]; 
      //NSLog(@"%@",event.companyID); 
      [points addObject:event]; 

     } 
     count++; 
     if(count == 300) { 
      //limit number of events to 300 
      break; 
     } 
    } 



    for (int i=0; i<points.count; i++) { 
     AnnotationData *annData = [points objectAtIndex:i]; 


     coordinate.latitude = annData.latitude; 
     coordinate.longitude = annData.longitude; 
     CLLocationCoordinate2D newCoord = {coordinate.latitude, coordinate.longitude}; 
     PlaceAnnotation* annotation = [[PlaceAnnotation alloc] initWithCoordinate:newCoord andID:i]; 
     annotation.mTitle = annData.title; 
     annotation.mSubtitle = annData.subtitle; 
     annotation.indexID = i; 

     //annotation.indexID = [[i]intValue]; 


     [mapView addAnnotation:annotation]; 

     [annotation release]; 

    } 


} 




- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 




- (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKPinAnnotationView *pinAnnotation = nil; 
    if(annotation != mV.userLocation) 
    { 
     static NSString *defaultPinID = @"myPin"; 
     pinAnnotation = (MKPinAnnotationView *)[mV dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 
     if (pinAnnotation == nil) 
      pinAnnotation = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease]; 

     pinAnnotation.canShowCallout = YES; 

     //instatiate a detail-disclosure button and set it to appear on right side of annotation 
     UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     pinAnnotation.rightCalloutAccessoryView = infoButton; 





     //infoButton.tag = 
     //[infoButton addTarget:self action:@selector(onMapVenueSelect) forControlEvents:UIControlEventTouchUpInside]; 
     //defaultPinID.rightCalloutAccessoryView = infoButton; 
     //infoButton.tag = [event indexOfObject:tmpVenueData]; 
     // [defaultPinID release]; 

    } 

    return pinAnnotation; 
    [pinAnnotation release]; 
} 

grâce

Répondre

3

Envisagez d'utiliser le protocole MKAnnotation et de stocker tout ce dont vous avez besoin ID ou données de votre objet.

Un en-tête de point de départ pourrait aller quelque chose comme ceci:

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 
#import <CoreLocation/CoreLocation.h> 


@interface YourFancyAnnotationClass : NSObject <MKAnnotation> { 
    CLLocationCoordinate2D coordinate; 
    NSString *title; 
    NSString *subtitle; 
    NSNumber *companyID; 
} 

@property(nonatomic, assign) CLLocationCoordinate2D coordinate; 
@property(nonatomic, copy) NSString *title; 
@property(nonatomic, copy) NSString *subtitle; 
@property(nonatomic, copy) NSNumber *companyID; 



@end 




Then in your delegate do something like this... 

    - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
    { 
     NSLog(@"calloutAccessoryControlTapped:"); 
     YourFancyAnnotationClass *tappedSite = (SiteAnnotation *)[view annotation]; 
     NSNumber *companyIDThatWasClickedExample = [tappedSite companyID]; 

etc ...

+0

que je fais déjà, mais une fois que je tente d'ajouter la balise dans la méthode viewForAnnotation, il retourne juste 0, à chaque fois. Y a-t-il une raison pour laquelle vous avez utilisé NSNumber au lieu de NSUInteger? –

+0

Pourquoi utilisez-vous un tag? Je ne suis pas sûr de comprendre le but d'une étiquette dans ce scénario. Accédez simplement à la propriété dont vous avez besoin. NSUInteger serait bien juste et exemple. – Nick

+0

J'ai ajouté un exemple de la façon d'accéder à l'ID via la méthode de délégation d'annotation accessoirecontrolapped. – Nick

Questions connexes