web-dev-qa-db-fra.com

Exécuter Segue par programme et passer des paramètres à la vue de destination

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

- (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 méthode prepareForSegue, je peux y faire référence avec: myDestinationViewController *vc = [segue destinationViewController];, mais je ne sais pas comment exécuter cela par programmation.

Avez-vous des idées?

Merci, yassa


METTRE À JOUR:

Je suis désolé pour cette question !!! J'ai simplement découvert que, même si la séquence est appelée par programme, la méthode prepareForSegue est quand même appelée et il est donc possible de passer des paramètres de la même manière habituelle.

172
yassassin

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

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

104
trapper

Vieille 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;

dataModel peut être string, int ou, 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;
    }
}
90
user1723341

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"
            }
        }
    }
2
Jonas Deichelmann

Je comprends le problème de l'exécution de la transition à un endroit et du maintien de l'état d'envoi des paramètres pour préparer la transition.

J'ai trouvé un moyen de faire ça. J'ai ajouté une propriété appelée userInfoDict à ViewControllers à l'aide d'une catégorie. et j’ai aussi ignoré effectuer le classement avec l’identifiant aussi, de sorte que Si l’envoyeur est lui-même (signifie le contrôleur lui-même). Il transmettra ce userInfoDict au prochain ViewController.

Ici, au lieu de transmettre l’ensemble UserInfoDict, vous pouvez également transmettre les paramètres spécifiques, en tant qu’expéditeur, et les remplacer en conséquence.

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

0
karthik1729

Au cas où vous utiliseriez une nouvelle version de Swift.

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

        }
}
0
Pokotuz