2017-06-30 1 views
0

J'essaie d'envoyer plusieurs objets de mon contrôleur de vue initial à mon Username VC. Voici le code segue de mes contrôleurs: Le problème survient lorsque j'ajoute le code pour envoyer le deuxième objet, termreport. Si je supprime le termsM et l'affectation, il envoie les étudiants comme d'habitude, mais j'ai aussi besoin d'envoyer l'objet termReport. Comment pourrais-je résoudre ce problème?Envoi rapide de plusieurs objets à View Controller

ViewControler:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    guard let students = sender as AnyObject as? [Student] 
    else { return } 
    guard let termsM = sender as AnyObject as? [TermReport] //How would I send both objects? 
    else { return } 
    if let secondVC = segue.destination as? UsernameVC { 
     secondVC.students = students 
     secondVC.userWebView = webView 
     secondVC.terms = termsM // not sending 
    } 
    let gradeResponse = try Parser(innerHTML) 
    self.performSegue(withIdentifier: "ShowStudents", sender: gradeResponse.students) 
    self.performSegue(withIdentifier: "ShowStudents", sender: gradeResponse.termReports) //how would I send both variables? 

UsernameVC:

var terms: [TermReport]! 
override func viewDidLoad() { 
    print("TERM \(terms[0].grades[3])")//returns found nil optional ERROR 
} 

Répondre

2

Vous devez inclure toutes les variables que vous souhaitez envoyer à un autre ViewController en utilisant un enchaînement en un seul objet (qui peut être une collection aussi bien). Vous créez une classe/structure personnalisée qui a des propriétés de type [Student] et [TermReport] ou les placez dans une collection native (Tuple ou Dictionary).

Créer struct personnalisé:

struct TermData { 
    var students = [Student]() 
    var termReports = [TermReport]() 
} 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    guard let segueData = sender as? TermData 
    else { return } 
    if let secondVC = segue.destination as? UsernameVC { 
     secondVC.students = segueData.students 
     secondVC.userWebView = webView 
     secondVC.terms = segueData.termReports 
     } 
}  

let gradeResponse = try Parser(innerHTML) 
let termData = TermData(students: gradeResponse.students, termReports: gradeResponse.termReports) 
self.performSegue(withIdentifier: "ShowStudents", sender: termData) 
+0

façon très cool de faire ça! Travaillé vraiment bien. Merci. Une chose cependant quand vous assignez let termData = TermData(), vous devez l'instancier avec les paramètres puis supprimer les deux lignes suivantes. À part ça, ça fonctionne très bien. – yzet00

+0

Heureux que vous le trouviez utile. Oui, vous avez raison, j'aurais dû déclarer 'termData' comme mutable, mais dans ce cas vous avez raison, il peut être initialisé avec les valeurs tout de suite, donc c'est une solution encore plus propre. –