mapkit,使用注释索引标记公开按钮

时间:2010-10-19 09:09:23

标签: iphone objective-c mapkit

我已经在这几天苦苦挣扎,我甚至重新编写了一半的代码来尝试另一种方式。

我从csv导入了我的注释,并使用平铺和副标题放置在地图上,我试图向显示按钮添加标签,这样我可以看到哪一个被点击,但有问题,无论我有什么价值观分配给注释我似乎无法访问它们(如索引)我可以访问标题和副标题,但就是这样。

如何为注释指定一个索引,然后我可以将其添加到按钮作为标记,这样我就可以记录点击

这是我的代码

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

感谢

1 个答案:

答案 0 :(得分:3)

考虑使用MKAnnotation协议,并根据您的对象存储您需要的ID或数据。

起点标题可能是这样的:

#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];

等...