mapkit, помечая кнопку раскрытия с индексом аннотации - PullRequest
2 голосов
/ 19 октября 2010

Я боролся с этим в течение нескольких дней, я даже переписал половину кода, чтобы попробовать его по-другому.

У меня есть свои аннотации, импортированные из 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 Ответ

3 голосов
/ 19 октября 2010

Подумайте об использовании протокола MKAnnotation и сохраните любой нужный вам идентификатор или данные для вашего объекта.

Заголовок начальной точки может выглядеть примерно так:

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

и т.д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...