Führen Sie die Segue programmgesteuert durch und übergeben Sie die Parameter an die Zielansicht


174

In meiner App habe ich eine Schaltfläche, die programmgesteuert einen Übergang ausführt:

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

Ich würde gerne wissen, ob es eine Möglichkeit gibt, auf die Zielansicht zu verweisen und einige Parameter zu übergeben.

Ich weiß, dass prepareForSegueich mich in der Methode mit: darauf beziehen kann myDestinationViewController *vc = [segue destinationViewController];, aber ich weiß nicht, wie ich den Segue programmgesteuert ausführen soll.

Hast du eine Idee?

Danke, Yassa


AKTUALISIEREN:

Diese Frage tut mir leid !!! Ich habe einfach festgestellt, dass die prepareForSegueMethode auch dann aufgerufen wird, wenn der Segue programmgesteuert aufgerufen wird, und es daher möglich ist, Parameter auf die gleiche übliche Weise zu übergeben.


44
Fügen Sie das Update als Antwort hinzu und akzeptieren Sie es, damit die Leute wissen, dass dies beantwortet wurde :)
danielbeard

Antwort hinzufügen, Kommentar zur Benachrichtigung.
DanSkeel

11
Sie sollten die Antwort unten als richtig markieren , damit die Leute wissen, dass sie beantwortet wurde.
Lindon Fox

Antworten:


107

Die Antwort ist einfach, dass es keinen Unterschied macht, wie der Übergang ausgelöst wird.

Die prepareForSegue:sender:Methode wird in jedem Fall aufgerufen und hier geben Sie Ihre Parameter weiter.


3
Das stört mich immer noch - das bedeutet, dass ich Seggue an einer Stelle auslösen muss, an der ich die Daten, die ich senden möchte, als Parameter senden möchte, die gut von allem anderen isoliert sind, aber diese Daten an einer ganz anderen Stelle hinzufügen muss - der prepareForSegue, wo wir Ich weiß nichts über die Daten, die übergeben werden müssen. Das heißt, ich muss mit diesen Daten einen Status in dem Kontext erstellen, der von zwei verschiedenen Funktionen gemeinsam genutzt wird (eine löst Segue aus, die andere - Vorbereitung). Ich möchte den Zustand nicht verschmutzen, wenn ich nur eine neue Ansicht mit einigen Daten öffnen muss ...
NeverwinterMoon

Verwendung Absender Kontext passieren erforderlich , um das Ziel VC zu konfigurieren
Trapper

Ich nahm an, dass das Übergeben von Nutzdaten im Absender ein Anti-Muster ist. Es sollte nur die Informationen darüber enthalten, wer den Segue ausgelöst hat, nicht die Daten, die das Ding, das den Segue ausgelöst hat, weitergeben wollte.
NeverwinterMoon

Aus den offiziellen Absenderdokumenten: "Dieses Objekt wird während des eigentlichen Abschnitts zu Informationszwecken zur Verfügung gestellt."
NeverwinterMoon

1
Ja, übergeben Sie keine tatsächliche Nutzlast, übergeben Sie den Kontext, z. B. welche Zelle / Schaltfläche / Index / usw. den Übergang ausgelöst hat.
Trapper

90

Alte Frage, aber hier ist der Code, wie Sie das tun, was Sie fragen. In diesem Fall übergebe ich Daten aus einer ausgewählten Zelle in einer Tabellenansicht an einen anderen Ansichtscontroller.

in der .h-Datei der Trget-Ansicht:

@property(weak, nonatomic)  NSObject* dataModel;

in der .m-Datei:

@synthesize dataModel;

dataModelkann sein string, intoder wie in diesem Fall ist es ein Modell, das viele Elemente enthält

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

ODER...

- (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

Ich verstehe das Problem, den Segue an einem Ort durchzuführen und den Status beizubehalten, um Parameter zur Vorbereitung des Segues zu senden.

Ich habe einen Weg gefunden, dies zu tun. Ich habe ViewControllers mithilfe einer Kategorie eine Eigenschaft namens userInfoDict hinzugefügt. und ich habe überschreibe, führe segue auch mit der Kennung durch, so dass Wenn der Absender selbst ist (bedeutet der Controller selbst). Dieses userInfoDict wird an den nächsten ViewController übergeben.

Anstatt den gesamten UserInfoDict zu übergeben, können Sie hier auch die spezifischen Parameter als Absender übergeben und entsprechend überschreiben.

Eine Sache, die Sie beachten müssen. Vergessen Sie nicht, die Super-Methode in Ihrer performSegue-Methode aufzurufen.


0

Falls Sie eine neue schnelle Version verwenden.

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

        }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.