通过 Segue 将数据传递到新的 ViewController



我正在尝试通过 segue 传递一串数据。JSON 数据已使用 JSONDecoder 解析,并正确显示在控制台中。一切都工作正常,除了当我尝试将数据传递给详细信息视图控制器时,我要么没有收到任何数据,要么出现错误。我正在使用prepareForSegue来传递数据。

以下是视图控制器的代码:

var nowPlaying = [Results]()
var searchTitle = [Results]()
struct NowPlaying: Codable {
let results: [Results]
}
struct Results: Codable {
let title: String
let poster_path: String?
let id: Int
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
var films: [Results]
if searchBar.text == "" {
films = [nowPlaying[indexPath.row]]
}
print("(films)")
performSegue(withIdentifier: "detailsSegue", sender: films)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "detailsSegue" {
if let detailView = segue.destination as? DetailsView {
let filmCell = sender as? Results
detailView.filmId = filmCell!.id
print("(filmCell!.id)")
}
}
}

我在detailView.filmId = filmCell.id收到错误

无法分配类型为"线程 1"的值:致命错误:解开可选值时意外发现 nil

这是打印到控制台print("(films)")的内容:

[Film_Bee.FilmsViewController.Results(title: "Venom", poster_path: 
Optional("/2uNW4WbgBXL25BAbXGLnLqX71Sw.jpg"), id: 335983)]

没有打印任何内容print("(filmCell!.id)")

我不确定如果在解析和选择单元格时找到id,为什么在结果中找不到id。

这是我在DetailsView的代码:

class DetailsView: UIViewController {
let homepage = FilmsViewController()
var filmId = 0
var filmDetails = [Details]()
struct Results: Codable {
let title: String
let poster_path: String?
let id: Int
}
struct Details: Codable {
let title: String
let poster_path: String
}
override func viewDidLoad() {
super.viewDidLoad()
print(filmId)
}

你定义

var films: [Results]

然后致电

performSegue(withIdentifier: "detailsSegue", sender: films)

然后投射

let filmCell = sender as? Results

这将不起作用,因为Results不是[Results],决定是想要一个Result数组还是只有一个。

重新考虑你的单数/复数命名。你想传递一个胶片,而不是一个数组

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let film : Results // singular form `Result` is less confusing
if searchBar.text.isEmpty {
film = nowPlaying[indexPath.row]
} else {
film = searchTitle[indexPath.row]
}
print("(film)")
performSegue(withIdentifier: "detailsSegue", sender: film)
}

最新更新