使用自定义struct数据类型将数据传递到另一个视图控制器,需要初始化器吗?

时间:2017-07-15 00:47:22

标签: ios swift macos

使用自定义结构数据类型时,如何将数据传递到另一个视图控制器?我认为我遇到的问题是在第二个视图控制器中定义变量。

这就是我将数据传递给下一个视图控制器的方式:

let sessionDetailsViewController = segue.destination as! SessionDetailsViewController

let indexPathRow = sender as! Int
sessionDetailsViewController.session = myFeed[indexPathRow]

session的结构数据类型为Feed

然后在我的SessionDetailsViewController中,我试图设置session变量,如下所示:

var session: Feed

但是如果我这样做,我会收到一个关于没有初始化者的错误。所以我尝试像这样实现一个初始化器:

init(session: Feed) {
    self.session = session

    super.init(nibName: nil, bundle: nil)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented, SessionDetailedViewController")
}

应用程序编译,然后当我触发segue到这个类时,它会在fatalError调用时崩溃。

在我使用Feed结构数据类型之前,我一直在使用NSDictionary,我这样定义:

var session = NSDictionary()

这很好用。如果我尝试对Feed采取相同的方法,Xcode会尝试让我创建一个新的Feed对象将其所有参数(正如我所知,()创建一个新的实例)。

那么如何将所需参数传递给此视图控制器?另外,有没有办法确保这个控制器总是用这些参数实例化(因为我认为这将是一个很好的编码实践)?

2 个答案:

答案 0 :(得分:0)

您需要将会话声明为可选。在初始化时没有给出任何值的任何东西都需要是可选的。

var session: Feed?

您还参加了prepareForSegue电话会议吗?我会像这样编码。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let indexPath = tableView.indexPathForSelectedRow else { return }
    let sessionAtIndexPath = myFeed[indexPath.row]
    (segue.destination as! SessionDetailsViewController).session = sessionAtIndexPath
}

答案 1 :(得分:0)

您可以将session声明为隐式展开的可选项(将在启动了segue的视图控制器的prepare(for:sender:)中设置)。无需自定义init

var session: Feed!

要明确,Feed!是可选的。它只是一个“隐式解包”的可选项(无论你在哪里使用它都隐式展开)。它适用于你的应用程序中的逻辑指示它可能在init完成时未设置的情况,但是一旦实际使用它,它将始终被设置,这就是这里的情况。