2010-11-10 7 views
0

J'ai une vue de carte avec des annotations d'épingles dedans. Je dois passer à la vue de détail les coordonnées d'une broche lorsque l'utilisateur appuie sur le bouton de divulgation de l'information de broche. Comment puis-je obtenir les coordonnées de la broche quand je suis dans la méthode showDetails? J'utilise le code suivant.Obtention des coordonnées de UINavigationController dans la méthode showDetails

- (void)showDetails:(id)sender { 

DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil ]; 

    // HERE I NEED TO PASS THE COORDINATES OF THE PIN TO THE DETAILVIEWCONTROLLER. 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
[detailViewController release]; 
} 


- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation { 

// If it's the user location, just return nil. 
if ([annotation isKindOfClass:[MKUserLocation class]]) 
    return nil; 
else { // Handles the other annotations. 
    // Try to dequeue an existing pin view first. 
    static NSString *AnnotationIdentifier = @"AnnotationIdentifier"; 
    MKPinAnnotationView *pinView = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier]; 

    if (!pinView) { 
    // If an existing pin view was not available, creates one. 
    MKPinAnnotationView *customPinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease]; 
    customPinView.animatesDrop = YES; 
    customPinView.canShowCallout = YES; 

    // Adds a detail disclosure button. 
    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; 
    customPinView.rightCalloutAccessoryView = rightButton; 

    return customPinView; 
    } else 
    pinView.annotation = annotation; 
} 

return nil; 
} 

Merci d'avoir lu.

Répondre

0

Je ne peux pas vous donner une solution de code de travail en ce moment depuis que je n » J'ai mon mac ici. Mais je peux vous parler d'une approche possible.

Créez une méthode dans DetailViewController qui remplit ses attributs, de sorte que vous puissiez l'appeler depuis showDetails, avant de le pousser. Donc, la séquence des événements serait comme ça.

Cliquez sur le bouton d'information -> showDetails appelés -> DetailViewController créée et -> pousser DetailViewController

espère que cela vous a aidé

+0

Bonjour Francisco. J'utilise une solution similaire. Créez une variable de classe qui contient les coordonnées de la dernière annotation cliquée. Merci quand même. –

0

Vous pouvez UIButton votre bouton personnalisé comme ceci:

@interface CustomButton : UIButton { 

CLLocationCoordinate2D pinCoordinate; }

maintenant dans votre viewForAnnotation:

// Adds a detail disclosure button. 
CustomButton *rightButton = [CustomButton buttonWithType:UIButtonTypeDetailDisclosure]; 
rightButton.pinCoordinate = annotation.coordinate 
[rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; 
customPinView.rightCalloutAccessoryView = rightButton; 

Et enfin pour obtenir les coordonnées dans la méthode showDetails:

CLLocationCoordinate2D currentCoord = ((CustomButton*)sender).pinCoordinate; 
+0

Merci pour votre réponse MathieuF. J'ai essayé votre solution, mais cela ne fonctionne pas. Je crée votre bouton et une méthode setter dans le fichier m, mais lorsque j'affecte annotation.coordinate à righButton.pinCoordinate, j'obtiens cette exception '- [UIButton setCoordinate:]: sélecteur non reconnu envoyé à l'instance 0x6b70120'. Quelqu'un sait-il pourquoi? –

+0

Quel est le type de votre bouton droit? Avez-vous mis cela dans votre code: CustomButton * rightButton = [CustomButton buttonWithType: UIButtonTypeDetailDisclosure]; ? – MathieuF

+0

Maintenant, c'est juste. Merci pour vos réponses! –