2

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

这是 ViewController 的代码:

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)")

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

这是我在 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)

}
4

2 回答 2

3

你定义

var films: [Results]

然后打电话

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

然后投

let filmCell = sender as? Results

这不起作用,因为Resultsis not [Results],决定你是想要一个Results 数组还是一个数组。

于 2018-10-09T17:57:26.660 回答
1

重新考虑您的单数/复数命名。你想通过一部电影,而不是阵列

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)

}
于 2018-10-09T18:08:13.330 回答