Daten durch segue weiterleiten

70

Ich mache eine einfache iOS-Anwendung mit Tableview Controller und DetailView. Ich möchte nur Daten durch segue weiterleiten.

So sieht es aus

So sieht es aus.

Ich möchte nur, dass Sie auf "Markíza" klicken, um das URL-Video Nummer 1 zu öffnen. Wenn Sie auf "TV JOJ" klicken, wird das URL-Video Nummer 2 im Player geöffnet.

Meine Tabellenansichtszellen:

    struct Program {
        let category : String
        let name : String
    }


   var programy = [Program]()
        self.programy = [Program(category: "Slovenské", name: "Markíza"),
                         Program(category: "Slovenské", name: "TV JOJ")]
Patrikbelis
quelle

Antworten:

138

Swift funktioniert genauso wie Obj-C, wird jedoch in der neuen Sprache überarbeitet. Ich habe nicht viele Informationen aus Ihrem Beitrag, aber lassen Sie uns jedem TableViewController einen Namen geben, um meine Erklärung zu erleichtern.

HomeTableViewController (dies ist der Screenshot, den Sie oben haben)

PlayerTableViewController (dies ist der Player-Bildschirm, zu dem Sie reisen möchten)

Vor diesem Hintergrund benötigen Sie in PlayerTableViewController eine Variable, in der die übergebenen Daten gespeichert werden. Haben Sie direkt unter Ihrer Klassendeklaration so etwas (wenn Sie die Struktur als einzelnes Objekt und nicht als Array speichern möchten:

class PlayerTableViewController: UITableViewController {

    var programVar : Program?

    //the rest of the class methods....

Danach gibt es zwei Möglichkeiten, Daten an den neuen TableViewController zu senden.

1) Verwenden von prepareForSegue

Am Ende von HomeTableViewController verwenden Sie die prepareForSegue-Methoden, um die Daten zu übergeben. Hier ist ein Beispiel für den Code, den Sie verwenden werden:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

    // Create a variable that you want to send
    var newProgramVar = Program(category: "Some", name: "Text")

    // Create a new variable to store the instance of PlayerTableViewController 
    let destinationVC = segue.destinationViewController as PlayerTableViewController
    destinationVC.programVar = newProgramVar
    }
}

Sobald PlayerTableViewController geladen wurde, ist die Variable bereits festgelegt und kann verwendet werden

2) Verwenden von didSelectRowAtIndexPath

Wenn bestimmte Daten basierend auf der ausgewählten Zelle gesendet werden müssen, können Sie didSelectRowAtIndexPath verwenden. Damit dies funktioniert, müssen Sie Ihrem Segue in der Storyboard-Ansicht einen Namen geben (lassen Sie mich wissen, wenn Sie auch wissen müssen, wie das geht).

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    // Create a variable that you want to send based on the destination view controller 
    // You can get a reference to the data by using indexPath shown below
    let selectedProgram = programy[indexPath.row]

    // Create an instance of PlayerTableViewController and pass the variable
    let destinationVC = PlayerTableViewController()
    destinationVC.programVar = selectedProgram

    // Let's assume that the segue name is called playerSegue
    // This will perform the segue and pre-load the variable for you to use
    destinationVC.performSegueWithIdentifier("playerSegue", sender: self)
}

Lassen Sie mich wissen, wenn Sie weitere Informationen dazu benötigen

Sasha Reid
quelle
Sasha. Überprüfen Sie meine Antwort. Ich muss mögen. Wenn auf CELL1 geklickt wird, wird Link 1 geöffnet. Wenn auf CELL2 geklickt wird, wird Link2 geöffnet
patrikbelis
5
Ich habe den 2) -Ansatz ausprobiert und bekomme immer eine Ausnahme, die besagt, dass "Receiver PlayerTableViewController keinen Übergang mit der Kennung 'playerSegue' hat". Nur das Aufrufen performSegueWithIdentifierfunktioniert einwandfrei, aber dann werden keine Daten in die neue Ansicht übertragen. : [
obwohl
2
@althaus @SashaReid ist nicht besser indexPathForSelectedRowals didSelectRowAtIndexPathRückruf? Beispiel: destinationVC.programVar = products[self.tableView.indexPathForSelectedRow!.row]in der prepareForSegueMethode. Lassen Sie mich wissen, wenn ich falsch liege (ich bin auch neu in dem Zeug).
Paulo Henrique Nonaka
29
@ SashaReid Ich habe das gleiche Problem wie das, was in einem früheren Kommentar erwähnt wurde. Ich versuche die 2. Methode zu machen und bin etwas verwirrt. Der Übergang wechselt im Beispiel von HomeTableVC zu PlayerTableVC. Warum verwenden wir also destinationVC.performSegueWithIdentifier ("playerSegue", Absender: self)? Ist der aktuelle VC nicht derjenige, der den Segue durchführt?
FortuneFaded
2
Ich denke, die letzte Zeile, die .performSegueWithIdentifier () aufruft, sollte auf self anstatt auf destinationVc
Herno
50

Mit Swift 3 & 4

Im ersten ViewController (Wert senden)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "MainToTimer") {
        let vc = segue.destination as! YourViewController
        vc.verificationId = "Your Data"
    }
}

In der zweiten AnsichtController (Catch The Value)

var verificationId = String()
Imtee
quelle
1
var var_name = String () - Verwenden Sie dies im zweiten Viewcontroller, um den Wert
abzufangen
4

Wenn Sie die Aktion nicht anhand des Bezeichners, sondern nur anhand der Zielklasse erkennen müssen ...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vc = segue.destination as? YourViewController {
        vc.var_name = "Your Data"
    }
}
Andrea Leganza
quelle