2012-07-31 3 views
0

J'ai un MapView, les annotations proviennent d'une liste de propriétés. Maintenant, j'aimerais voir plus de données dans la vue détaillée. Malheureusement, je ne sais pas comment programmer le Segue, afin que les données puissent être affichées. J'espère que vous comprenez ce que je veux dire. Mon anglais n'est pas si bon ... Je sais qu'il manque quelques uns dans la méthode prepareforSegue. J'utilise le storyboard. avance merci pour votre aide ... ce qui concerneMKMapView voir DetailView - Comment faire un segue

#import "MapViewNewController.h" 
#import "MapViewAnnotation.h" 
#import "SetCardController.h" 



@interface MapViewNewController() 



@end 

@implementation MapViewNewController 


@synthesize recipesDictionary = _recipesDictionary; 

@synthesize mapView; 
@synthesize locationManager; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 



- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.mapView.delegate = self; 

    [self.mapView setShowsUserLocation:YES]; 


    MKCoordinateRegion newRegion ; 
    newRegion.center.latitude = 50.080635; 
    newRegion.center.longitude = 8.518717; 
    newRegion.span.latitudeDelta = 15.5; 
    newRegion.span.longitudeDelta = 15.5; 
    [mapView setRegion:newRegion animated:YES]; 



    NSString *path = [[NSBundle mainBundle] pathForResource:@"Rezepte" ofType:@"plist"]; 
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path]; 
    NSArray *anns = [dict objectForKey:@"myRecipes"]; 
    for(int i = 0; i < [anns count]; i++) { 
     float realLatitude = [[[anns objectAtIndex:i] objectForKey:@"latitude"] floatValue]; 
     float realLongitude = [[[anns objectAtIndex:i] objectForKey:@"longitude"] floatValue]; 

     MapViewAnnotation *myAnnotation = [[MapViewAnnotation alloc] init]; 
     CLLocationCoordinate2D theCoordinate; 
     theCoordinate.latitude = realLatitude; 
     theCoordinate.longitude = realLongitude; 
     myAnnotation.coordinate = theCoordinate; 
     myAnnotation.title = [[anns objectAtIndex:i] objectForKey:@"blogname"]; 
     myAnnotation.subtitle = [[anns objectAtIndex:i] objectForKey:@"blogger"]; 
     [mapView addAnnotation:myAnnotation]; 


    }  

} 


-(MKAnnotationView *)mapView:(MKMapView *)view viewForAnnotation:(id<MKAnnotation>)annotation { 
    MKPinAnnotationView *pin = nil; 

    if ([annotation isKindOfClass:[MapViewAnnotation class]]) { 
     NSString *pinIdentifier = @"myPin"; 


     pin = (MKPinAnnotationView*)[view dequeueReusableAnnotationViewWithIdentifier:pinIdentifier]; 
     if (!pin) { 


      pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinIdentifier]; 

      pin.image = [UIImage imageNamed:@"pin2.png"]; 
      pin.canShowCallout = YES; 

      pin.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 


     } 
      } 

    return pin; 
} 



//if Button pressed 
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{ 

    [self performSegueWithIdentifier:@"showPinDetails" sender:self]; 




    } 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([segue.identifier isEqualToString:@"showPinDetails"]) { 

     // SetCardController *scc = [segue destinationViewController]; 


    } 
} 

Répondre

0

Je crois que vous n'avez pas défini l'identifiant de l'Segue dans Interface Builder. J'ai essayé votre code et cela a fonctionné pour moi (Xcode 4.4 SDK iOS 5.1)

1

Lorsque vous performSegueWithIdentifier:sender d'un intérieur annotationView:view callout, l'expéditeur peut être la propriété view.annotation, qui identifie de manière unique l'utilisateur callout que l'juste exploité.

0

Les deux réponses ci-dessus aident, mais ne vous aident pas à identifier les détails uniques des broches qui, je suppose, font partie de votre p-list.

Toutes les vues héritent de la propriété d'un tag. Il peut l'utiliser pour contenir un index (ou une clé) de broche et donc le transmettre au contrôleur de vue de destination pour identifier de manière unique les données que vous détenez. Lorsque votre bouton dans la vue d'appel hérite de la vue, vous pouvez le marquer et passer l'index lorsqu'il est actif dans la méthode didselectAnnotationView. L'instruction if utilisée désélectionne la broche de localisation de l'utilisateur. Le paramètre detailButton.tag peut maintenant être utilisé comme paramètre dans la sélection d'un segment.

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
// Post data to destination VC 

if ([[segue identifier] isEqualToString:@"clubsToDetail"]) 
{ 


    ClubsMasterData *current = [[ClubsMasterxmlParser ClubsMasterDatas] objectAtIndex:detailButton.tag]; 


    ClubsDetailViewController *DVC = [[ClubsDetailViewController alloc] init]; 
    DVC = [segue destinationViewController]; 


    DVC.linkURL = current.linkURL; 
    DVC.distance = current.distance; 

} 
} 

Ici, j'ai indexé un tableau plutôt qu'un Plist, mais le principal est le même.

Questions connexes