使用自定义结构数据类型时,如何将数据传递到另一个视图控制器?我认为我遇到的问题是在第二个视图控制器中定义变量。
这就是我将数据传递给下一个视图控制器的方式:
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
对象将其所有参数(正如我所知,()
创建一个新的实例)。
那么如何将所需参数传递给此视图控制器?另外,有没有办法确保这个控制器总是用这些参数实例化(因为我认为这将是一个很好的编码实践)?
答案 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
完成时未设置的情况,但是一旦实际使用它,它将始终被设置,这就是这里的情况。