Comment connecter les buttons de vue d'annotation de carte avec la database pour passer à une autre vue?

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation { //if it's user location, return nil if ([annotation isKindOfClass:[MKUserLocation class]]) return nil; //try to dequeue an existing pin view first static NSSsortingng* AnnotationIdentifier = @"AnnotationIdentifier"; MKPinAnnotationView* pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier]; pinView.animatesDrop = YES; pinView.canShowCallout = YES; pinView.pinColor = MKPinAnnotationColorRed; //button on the right for popup for pins UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; [rightButton setTitle:annotation.title forState:UIControlStateNormal]; [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; pinView.rightCalloutAccessoryView = rightButton; //zoom button on the left of popup for pins UIButton* leftButton = [UIButton buttonWithType:UIButtonTypeContactAdd]; [leftButton setTitle:annotation.title forState:UIControlStateNormal]; [leftButton addTarget:self action:@selector(zoomToLocation:) forControlEvents:UIControlEventTouchUpInside]; pinView.leftCalloutAccessoryView = leftButton; return pinView; } //for map view annotation right button -(void)showDetails:(id)sender{ NSLog(@"Annotation Click"); //fypAppDelegate *appDelegate = (fypAppDelegate *)[[UIApplication sharedApplication] delegate]; //Attraction *attraction = (Attraction *)[appDelegate.attractions objectAtIndex:sender]; infoViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"info"]; self.infoView = viewController; [self.navigationController pushViewController:infoView animated:true]; } //for map view annotation left button -(void)zoomToLocation:(id)sender{ NSLog(@"Annotation Click"); } 

Ci-dessus, le délégué pour les annotations cartocharts. Je suis capable d'afficher les épingles et d'afficher l'affichage des annotations cartocharts, mais je ne sais pas comment lier les events des buttons à la vue suivante (infoViewController). Donc, comme vous pouvez le voir, le bon button est celui que je veux utiliser pour permettre à l'user d'afficher plus d'informations sur ce lieu tandis que le button gauche, je veux permettre à l'user de zoomer sur les coordonnées de cette broche.

Les données proviennent de la database que j'ai créée. Voici comment je l'ai fait juste pour reference (au cas où vous pourriez en avoir besoin)

 -(void)putPins { fypAppDelegate *appDelegate = (fypAppDelegate *)[[UIApplication sharedApplication] delegate]; //get data [appDelegate readTopAttractions]; int i = 0; int count = appDelegate.attractions.count; self.mapAnnotations = [[NSMutableArray alloc] initWithCapacity:appDelegate.attractions.count]; while (i < count) { Attraction *attraction = (Attraction *)[appDelegate.attractions objectAtIndex:i]; i++; //Set coordinates for pin CLLocationCoordinate2D location; location.latitude = (double)[[attraction xCoor] doubleValue]; location.longitude = (double)[[attraction yCoor] doubleValue]; MapPin *mapPin = [[MapPin alloc] init]; [mapPin setCoordinate:location]; [mapPin setName: [attraction name]]; NSSsortingng *desc = [attraction description]; int i = 0, position; while(i < 50){ if ([desc characterAtIndex:i] == ' '){ position = i; i++; } else i++; } desc = [@"" ssortingngByAppendingFormat:@"%@%@", [desc subssortingngToIndex:position], @"..."]; [mapPin setDescription: desc]; [self.mapAnnotations addObject:mapPin]; } [self.mapView addAnnotations:self.mapAnnotations]; } 

S'il vous plaît dites-moi si vous avez besoin de plus de détails. Je vous remercie! =)

Dans vos showDetails: et zoomToLocation: vous pouvez get une reference à l'annotation dont le button de légende a été tapé en procédant comme suit:

 MapPin *ann = (MapPin *)[mapView.selectedAnnotations objectAtIndex:0]; 

Dans zoomToLocation: vous pouvez zoomer sur cette annotation en utilisant:

 [mapView setRegion: MKCoordinateRegionMakeWithDistance(ann.coordinate, 500, 500) //500 meters vertical span, 500 meters horizontal span animated:YES]; 

Dans showDetails: vous pouvez passer ann ou ses propriétés à la vue détaillée.

Par ailleurs, au lieu d'appeler des methods personnalisées à l'aide de addTarget dans viewForAnnotation , vous pouvez utiliser la méthode de délégué calloutAccessoryControlTapped la vue de calloutAccessoryControlTapped , qui donne un access plus direct à l'annotation qui a été tapée. Par exemple:

 -(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { MapPin *ann = (MapPin *)view.annotation; if (control == view.rightCalloutAccessoryView) { NSLog(@"calloutAccessoryControlTapped: control=RIGHT"); //show detail view (or you can call your custom method here)... } else if (control == view.leftCalloutAccessoryView) { NSLog(@"calloutAccessoryControlTapped: control=LEFT"); //zoom in (or you can call your custom method here)... } else { NSLog(@"calloutAccessoryControlTapped: unknown control"); } } 

Assurez-vous de supprimer les appels addTarget de viewForAnnotation si vous décidez d'utiliser la méthode déléguée calloutAccessoryControlTapped .

Vous voulez zoomer sur la broche particulière? Est-ce correct?

Vous pouvez donc utiliser la méthode setRegion: animated: – de MKMapView.

Exemple:

 mapView = MKMapView location = CLLLocationCoordinate2D METERS_PER_MILE = 1609.344 (defined as a Constant) MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, 0.5*METERS_PER_MILE, 0.5*METERS_PER_MILE); MKCoordinateRegion adjustedRegion = [mapView regionThatFits:region]; [mapView setRegion:adjustedRegion animated:YES]; 

AppleDocs
http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html

http://developer.apple.com/library/IOs/#documentation/MapKit/Reference/MapKitDataTypesReference/Reference/reference.html