359 votes

iOS comment passer prepareForSegue : un objet

J'ai beaucoup d'annotations dans une mapview (avec rightCalloutAccessory boutons). Le bouton pour effectuer une transition à partir de ce mapview d'un tableview. J'ai envie de passer à la tableview un autre objet (qui contient des données) selon la légende bouton a été cliqué.

Par exemple: (totalement)

  • annotation1 (Austin) -> col de données obj 1 (Austin)
  • annotation2 (Dallas) -> col de données obj 2 (Dallas)
  • annotation3 (Houston) -> col de données obj 3 et ainsi de suite... (vous avez l' idée)

Je suis en mesure de détecter la légende bouton a été cliqué.

Je suis à l'aide d' prepareForSegue: pour transmettre les données obj à la destination ViewController. Puisque je ne peux pas faire cet appel prendre un argument supplémentaire pour les données obj j'ai besoin, ce sont quelques élégantes manières d'obtenir le même effet (dynamic data obj)?

Tout conseil serait apprécié.

674voto

Simon Points 5686

Munissez-vous simplement d'une référence à la vue cible contrôleur dans prepareForSegue: méthode et réussir tous les objets que vous devez. Voici un exemple...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
    {
        // Get reference to the destination view controller
        YourViewController *vc = [segue destinationViewController];

        // Pass any objects to the view controller here, like...
        [vc setMyObjectHere:object];
    }
}

RÉVISION: Vous pouvez également utiliser performSegueWithIdentifier:expéditeur: méthode pour activer la transition vers un nouveau point de vue basé sur une sélection ou appuyez sur le bouton.

Par exemple, considérons j'ai eu deux contrôleurs. La première contient trois boutons et le second a besoin de savoir lequel de ces boutons a été pressé avant la transition. Vous pourriez fil les boutons jusqu'à une IBAction dans votre code qui utilise performSegueWithIdentifier: la méthode, c'est comme ça...

// When any of my buttons are pressed, push the next view
- (IBAction)buttonPressed:(id)sender
{
    [self performSegueWithIdentifier:@"MySegue" sender:sender];
}

// This will get called too before the view appears
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"MySegue"]) {

        // Get destination view
        SecondView *vc = [segue destinationViewController];

        // Get button tag number (or do whatever you need to do here, based on your object
        NSInteger tagIndex = [(UIButton *)sender tag];

        // Pass the information to your destination view
        [vc setSelectedButton:tagIndex];
    }
}

Espérons que cette aide. J'ai téléchargé un petit projet de test de sorte que vous pouvez voir ce que je veux dire basés sur de simples boutons et une vue unique de l'application (avec un supplément). Vous pouvez l'obtenir ici.

82voto

BlackRider Points 7347

La réponse acceptée n’est pas la meilleure façon d’y parvenir car il crée une dépendance de compilation inutile entre les deux contrôleurs de la vue. Voici comment vous pouvez le faire sans se soucier du type de la vue contrôleur de destination :

Donc tant que votre destination Découvre contrôleur déclare une propriété publique, par exemple :

vous pouvez définir cette propriété dans le contrôleur de vue précédente que j’ai décrit ci-dessus.

16voto

neoneye Points 11545

J’ai une classe de l’expéditeur, comme ceci

J’utilise cette classe de l’expéditeur pour passer des objets à``

4voto

Stefano Mondino Points 729

J'ai mis en place une bibliothèque avec une catégorie sur UIViewController qui simplifie cette opération. Fondamentalement, vous définissez les paramètres que vous souhaitez passer de l'un à l'NSDictionary associé à l'élément de l'INTERFACE utilisateur qui exécute la séquence. Il fonctionne avec manuel enchaîne trop.

Par exemple, vous pouvez le faire

[self performSegueWithIdentifier:@"yourIdentifier" parameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];

pour un manuel de transition ou de créer un bouton avec un segue et l'utilisation

[button setSegueParameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];

Si la destination-vue-contrôleur n'est pas valeur-clé de codage conforme pour une clé, rien ne se passe. Il fonctionne avec clé-valeurs trop (utile pour vous détendre enchaîne). Découvrez-le ici https://github.com/stefanomondino/SMQuickSegue

2voto

Matthew Purland Points 255

Voici une catégorie utile pour l’ajout d’une méthode performSegueWithIdentifier:sender:context.

https://github.com/pandamonia/A2StoryboardSegueContext

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X