Swift 向视图控制器发送多个对象

Posted

技术标签:

【中文标题】Swift 向视图控制器发送多个对象【英文标题】:Swift sending Multiple Objects to View Controller 【发布时间】:2017-06-30 15:44:32 【问题描述】:

我正在尝试将多个对象从我的初始视图控制器发送到我的Username VC。这是来自我的控制器的 segue 代码:当我添加代码以发送第二个对象 termreport 时,问题就出现了。如果我删除termsM 和作业,它会像往常一样发送学生,但我还需要发送termReport 对象。我该如何解决这个问题?

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?

用户名VC

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

【问题讨论】:

【参考方案1】:

您必须使用 segue 将要发送到另一个 ViewController 的所有变量包含到单个对象中(也可以是一个集合)。您可以创建一个自定义类/结构,该类/结构具有类型为 [Student][TermReport] 的属性,或者将它们放入本机集合(元组或字典)中。

创建自定义结构:

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)

【讨论】:

非常酷的方法!工作得很好。谢谢。但是,当您分配 let termData = TermData() 时,有一件事,您必须使用参数对其进行实例化,然后删除以下两行。除此之外,它的效果很好。 很高兴您发现它很有用。是的,你是对的,我应该将 termData 声明为可变的,但在这种情况下你是对的,它可以立即用值初始化,所以这是一个更清洁的解决方案。

以上是关于Swift 向视图控制器发送多个对象的主要内容,如果未能解决你的问题,请参考以下文章

从单视图控制器向多个ViewControllers发送“StringValue”的可能方法?

Swift - 远程通知和导航控制器流程

如何让一个按钮根据发送的变量连接到多个视图控制器,并发送一个新变量

如何将依赖项注入 iOS 视图控制器?

如何从视图控制器发送数据以在 swift 5 中嵌入视图控制器?

如何向对象发送消息?