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.
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.
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;
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ExampleSegueIdentifier" {
if let destinationVC = segue.destination as? ExampleSegueVC {
destinationVC.exampleString = "Example"
}
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ExampleSegueIdentifier" {
if let destinationVC = segue.destinationViewController as? ExampleSegueVC {
destinationVC.exampleString = "Example"
}
}
}
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.
Au cas où vous utiliseriez une nouvelle version de Swift.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ChannelMoreSegue" {
}
}