360 Stimmen

So übergeben Sie prepareForSegue: ein Objekt

Ich habe viele Annotationen in einer Kartenansicht (mit rightCalloutAccessory Tasten). Die Schaltfläche führt eine Überblendung von dieser mapview zu einer tableview . Ich möchte die tableview ein anderes Objekt (das Daten enthält), je nachdem, welche Schaltfläche des Aufrufs angeklickt wurde.

Zum Beispiel: (frei erfunden)

  • annotation1 (Austin) -> pass data obj 1 (relevant für Austin)
  • annotation2 (Dallas) -> pass data obj 2 (relevant für Dallas)
  • annotation3 (Houston) -> pass data obj 3 und so weiter... (Sie verstehen schon Idee)

Ich kann erkennen, welche Schaltfläche des Aufrufs angeklickt wurde.

Ich benutze prepareForSegue : Übergabe des Datenobjekts an das Ziel ViewController . Da ich diesen Aufruf nicht dazu bringen kann, ein zusätzliches Argument für das benötigte Datenobjekt anzunehmen, welche eleganten Möglichkeiten gibt es, denselben Effekt zu erzielen (dynamisches Datenobjekt)?

Für jeden Tipp wären wir dankbar.

6voto

Mohammad Zaid Pathan Punkte 15242

Pour Schnell dies verwenden,

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var segueID = segue.identifier

    if(segueID! == "yourSegueName"){

        var yourVC:YourViewController = segue.destinationViewController as YourViewController

        yourVC.objectOnYourVC = setObjectValueHere!

    }
}

4voto

Stefano Mondino Punkte 1219

Ich habe eine Bibliothek mit einer Kategorie auf UIViewController implementiert, die diesen Vorgang vereinfacht. Grundsätzlich legen Sie die Parameter, die Sie übergeben möchten, in einem NSDictionary fest, das mit dem UI-Element verknüpft ist, das die Überblendung durchführt. Es funktioniert auch mit manuellen Segues.

Sie können zum Beispiel Folgendes tun

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

für einen manuellen Übergang oder erstellen Sie eine Schaltfläche mit einem Übergang und verwenden Sie

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

Wenn der Ziel-View-Controller für einen Schlüssel nicht mit der Key-Value-Codierung konform ist, passiert nichts. Es funktioniert auch mit Key-Values (nützlich für Unwind Segues). Probieren Sie es hier aus https://github.com/stefanomondino/SMQuickSegue

2voto

Alvin George Punkte 13610

Meine Lösung ist ähnlich.

// In destination class: 
var AddressString:String = String()

// In segue:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
   if (segue.identifier == "seguetobiddetailpagefromleadbidder")
    {
        let secondViewController = segue.destinationViewController as! BidDetailPage
        secondViewController.AddressString = pr.address as String
    }
}

1voto

Parth Barot Punkte 305

Verwenden Sie einfach diese Funktion.

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let index = CategorytableView.indexPathForSelectedRow
    let indexNumber = index?.row
    let VC = segue.destination as! DestinationViewController
   VC.value = self.data

}

0voto

dannrob Punkte 1023

Ich habe diese Lösung verwendet, damit ich den Aufruf der Segue und die Datenkommunikation innerhalb derselben Funktion halten konnte:

private var segueCompletion : ((UIStoryboardSegue, Any?) -> Void)?

func performSegue(withIdentifier identifier: String, sender: Any?, completion: @escaping (UIStoryboardSegue, Any?) -> Void) {
    self.segueCompletion = completion;
    self.performSegue(withIdentifier: identifier, sender: sender);
    self.segueCompletion = nil
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.segueCompletion?(segue, sender)
}

Ein Anwendungsfall wäre etwa so:

func showData(id : Int){
    someService.loadSomeData(id: id) {
        data in
        self.performSegue(withIdentifier: "showData", sender: self) {
            storyboard, sender in
            let dataView = storyboard.destination as! DataView
            dataView.data = data
        }
    }
}

Dies scheint bei mir zu funktionieren, allerdings bin ich mir nicht zu 100 % sicher, dass die perform- und prepare-Funktionen immer auf demselben Thread ausgeführt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X