Mapkit with multi annotation (callout), mapping the next view

柔情痞子 提交于 2019-12-09 07:18:38

问题


Wanted some help with a problem with mapkit I am facing. Should be a silly problem or I have missed out something while going through the mapkit framework.

Here is the senario. I am placing multiple annotation on the map when the user performs some search like pizza. Added button for the right annotation view, on click which opens a next detail view. The problem is how to send some information to the next view, for example I add index to annotations while creating them, now I want to access this information from annotation, and pass it to the next view via the selector set on the button.

I have checked all the mapkit delicate, but don't find a one where I can map this information with the next view and annotation.

Hope I have not confused you guys in my question. Please let me know I will reframe it.

Thaking in advance.


回答1:


When you create the UIButton for the annotation, set the tag property (tag is an NSInteger property of UIView) to an id or array index that identifies the relevant object. You can then retrieve that tag value from the sender parameter to your selector.


Edit: here's some sample code.

You create your annotation view and associate the button in your delegate's -mapView:viewForAnnotation: method:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    // Boilerplate pin annotation code
    MKPinAnnotationView *pin = (MKPinAnnotationView *) [self.map dequeueReusableAnnotationViewWithIdentifier: @"restMap"];
    if (pin == nil) {
        pin = [[[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"restMap"] autorelease];
    } else {
        pin.annotation = annotation;
    }
    pin.pinColor = MKPinAnnotationColorRed
    pin.canShowCallout = YES;
    pin.animatesDrop = NO;

    // now we'll add the right callout button
    UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    // customize this line to fit the structure of your code.  basically
    // you just need to find an integer value that matches your object in some way:
    // its index in your array of MKAnnotation items, or an id of some sort, etc
    // 
    // here I'll assume you have an annotation array that is a property of the current
    // class and we just want to store the index of this annotation.
    NSInteger annotationValue = [self.annotations indexOfObject:annotation];

    // set the tag property of the button to the index
    detailButton.tag = annotationValue;

    // tell the button what to do when it gets touched
    [detailButton addTarget:self action:@selector(showDetailView:) forControlEvents:UIControlEventTouchUpInside];

    pin.rightCalloutAccessoryView = detailButton;
    return pin;

}

Then in your action method, you'll unpack the value from tag and use it to display the right detail:

-(IBAction)showDetailView:(UIView*)sender {
    // get the tag value from the sender
    NSInteger selectedIndex = sender.tag;
    MyAnnotationObject *selectedObject = [self.annotations objectAtIndex:selectedIndex];

    // now you know which detail view you want to show; the code that follows
    // depends on the structure of your app, but probably looks like:
    MyDetailViewController *detailView = [[MyDetailViewController alloc] initWithNibName...];
    detailView.detailObject = selectedObject;

    [[self navigationController] pushViewController:detailView animated:YES];
    [detailView release];
}



回答2:


In the Annotation view, is it possible to grab,say, the Title or Subtitle or any other information you used while creating pins? What i am looking to do is have a certain image popup in the annotation based on one of those variables.

#import "MapPin.h"

@implementation MapPin


@synthesize coordinate;
@synthesize title;
@synthesize subtitle;
@synthesize indexnumber;
@synthesize imageFile;

-(id)initWithCoordinates:(CLLocationCoordinate2D)location
               placeName: placeName
             description:description
                indexnum:indexnum
            imageFileLoc:imageFileLoc{

    self = [super init];
    if (self != nil) {
        imageFile=imageFileLoc;
        [imageFile retain];
        indexnumber=indexnum;
        [indexnumber retain];
        coordinate = location;
        title = placeName;
        [title retain];
        subtitle = description;
        [subtitle retain];
    }
    return self;

}



-(void)addAnnotations {

    // Normally read the data for these from the file system or a Web service
    CLLocationCoordinate2D coordinate = {35.9077803, -79.0454936};
    MapPin *pin = [[MapPin alloc]initWithCoordinates:coordinate
                                          placeName:@"Keenan Stadium"
                                        description:@"Tar Heel Football"
                                            indexnum:@"1"
                                        imageFileLoc:@"owl.jpg"];
    [self.map addAnnotation:pin];



回答3:


Another option:

You can implement these methods:

- (void)mapView:(MKMapView *)mapView didSelectAnnotation:(MKAnnotationView *)view;
- (void)mapView:(MKMapView *)mapView didDeselectAnnotation:(MKAnnotationView *)view;


来源:https://stackoverflow.com/questions/3488205/mapkit-with-multi-annotation-callout-mapping-the-next-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!