views:

25

answers:

1

i have been struggling with this for a few days, i even re-wrote half the code to try it another way.

i have my annotations imported from a csv, and placed onto the map with tile and subtitle, i am trying in vain to add a tag to disclosue buttons so i can see which one was tapped, but having problems, whatever values i assign to the annotation i cant seem to access them (like the index) i can access the title and subtitle, but thats it.

how do i assign a index to the annotation that i can then add to the button as a tag, so i can record the tap

here is my 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];
}

thanks

A: 

Consider using the MKAnnotation protocol and storing whatever you need ID or data wise your object.

A starting point header might go something like this:

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

Nick
i am already doing this, but once i try and add the tag in the viewForAnnotation method, it just returns 0, everytime. is there a reason you used NSNumber instead of NSUInteger?
richard Stephenson
Why are you using a tag? I'm not sure I understand the point of a tag in this scenario. Simply access the property you need. NSUInteger would be fine just and example.
Nick
I added an example of how to access the ID via the annotation accessorycontroltapped delegate method.
Nick