Effectuer une segmentation par programme et transmettre des paramètres à la vue de destination


174

dans mon application, j'ai un bouton qui effectue une séquence par programme:

- (void)myButtonMethod
{
    //execute segue programmatically
    [self performSegueWithIdentifier: @"MySegue" sender: self];
}

Je voudrais savoir s'il existe un moyen de référencer la vue de destination et de lui transmettre certains paramètres.

Je sais que dans la prepareForSegueméthode, je peux y faire référence avec:, myDestinationViewController *vc = [segue destinationViewController];mais je ne sais pas comment exécuter la segue par programme.

As tu des idées?

Merci, yassa


METTRE À JOUR:

Je suis désolé pour cette question !!! J'ai simplement découvert que, même si la segue est invoquée par programme, la prepareForSegueméthode est appelée de toute façon et il est donc possible de passer des paramètres de la même manière habituelle.


44
Ajoutez la mise à jour en tant que réponse et acceptez-la pour que les gens sachent que cela a été répondu :)
danielbeard

Ajouter une réponse, un commentaire pour notification.
DanSkeel

11
Vous devez marquer la réponse ci-dessous comme correcte, afin que les gens sachent qu'elle a été répondue.
lindon fox

Réponses:


107

La réponse est simplement que la façon dont la transition est déclenchée ne fait aucune différence.

La prepareForSegue:sender:méthode est appelée dans tous les cas et c'est là que vous passez vos paramètres.


3
Cela me dérange toujours - cela signifie que je dois déclencher la segue à un endroit, où j'ai les données que je veux envoyer en tant que paramètres bien isolés de toute autre chose, mais pour ajouter ces données dans un endroit complètement différent - le prepareForSegue, où nous je ne sais rien des données à transmettre. Cela signifie que je dois créer un état avec ces données en question dans le contexte partagé par deux fonctions différentes (l'une déclenchant la séquence, l'autre - la préparation). Je ne veux pas salir l'état quand tout ce dont j'ai besoin est d'ouvrir une nouvelle vue avec des données ...
NeverwinterMoon

Utilisez l'expéditeur pour transmettre le contexte nécessaire pour configurer le VC de destination
trappeur

J'ai supposé que le passage de la charge utile dans l'expéditeur était un anti-modèle. Il devrait simplement contenir les informations sur qui a déclenché la séquence, pas les données que la chose qui a déclenché la séquence avait l'intention de transmettre plus loin.
NeverwinterMoon

Extrait de la documentation officielle sur l'expéditeur: "Cet objet est mis à disposition à des fins d'information pendant la séquence réelle."
NeverwinterMoon

1
Ouais, ne transmettez pas une charge utile réelle, transmettez le contexte, comme la cellule / le bouton / l'index / etc. qui a déclenché la séquence.
trappeur

90

Ancienne question mais voici le code sur la façon de faire ce que vous demandez. Dans ce cas, je transmets les données d'une cellule sélectionnée dans une vue de tableau à un autre contrôleur de vue.

dans le fichier .h de la vue trget:

@property(weak, nonatomic)  NSObject* dataModel;

dans le fichier .m:

@synthesize dataModel;

dataModelpeut être string, intou comme dans ce cas, c'est un modèle qui contient de nombreux éléments

- (void)someMethod {
     [self performSegueWithIdentifier:@"loginMainSegue" sender:self];
 }

OU...

- (void)someMethod {
    UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
    [self.navigationController pushViewController: myController animated:YES];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"storyDetailsSegway"]) {
        UITableViewCell *cell = (UITableViewCell *) sender;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        NSDictionary *storiesDict =[topStories objectAtIndex:[indexPath row]];
        StoryModel *storyModel = [[StoryModel alloc] init];
        storyModel = storiesDict;
        StoryDetails *controller = (StoryDetails *)segue.destinationViewController;
        controller.dataModel= storyModel;
    }
}

3

Swift 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ExampleSegueIdentifier" {
        if let destinationVC = segue.destination as? ExampleSegueVC {
            destinationVC.exampleString = "Example"
        }
    }
}

Swift 3:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ExampleSegueIdentifier" {
            if let destinationVC = segue.destinationViewController as? ExampleSegueVC {
                destinationVC.exampleString = "Example"
            }
        }
    }

0

Je comprends le problème de l'exécution du segue à un endroit et du maintien de l'état pour envoyer des paramètres en préparation de la segue.

J'ai trouvé un moyen de le faire. J'ai ajouté une propriété appelée userInfoDict à ViewControllers à l'aide d'une catégorie. et j'ai surchargé effectuer le segue avec l'identifiant aussi, de telle manière que si l'expéditeur est lui-même (signifie le contrôleur lui-même). Il transmettra cet userInfoDict au prochain ViewController.

Ici, au lieu de passer tout le UserInfoDict, vous pouvez également transmettre les paramètres spécifiques, en tant qu'expéditeur et remplacer en conséquence.

1 chose que vous devez garder à l'esprit. n'oubliez pas d'appeler la super méthode dans votre méthode performSegue.


0

Dans le cas où vous utilisez une nouvelle version swift.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ChannelMoreSegue" {

        }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.