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

Posted

技术标签:

【中文标题】通过 Segue 将数据传递给新的 ViewController【英文标题】:Passing data to new ViewController through Segue 【发布时间】:2018-10-09 17:53:39 【问题描述】:

我正在尝试通过 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)") 没有打印

如果在解析时和选择单元格时找到了 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)


【问题讨论】:

【参考方案1】:

你定义

var films: [Results]

然后调用

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

然后投射

let filmCell = sender as? Results

由于Results 不是[Results],这将不起作用,请决定是需要Results 的数组还是只需要一个。

【讨论】:

如果我尝试let filmCell = sender as? [Results],我会在下一行收到错误Value of type '[FilmsViewController.Results]' has no member id @JSharpp 这是真的,因为数组没有id 属性,只有个别电影有,决定你想要的:数组或实例 好的,所以我将var films: [Results] 更改为var films: Results。这行得通,谢谢! @JSharpp 你去 :) 可能与 films = [nowPlaying[indexPath.row]] => films = nowPlaying[indexPath.row] 的更改分配!? 是的,下一行也一样。可能应该在那里添加。【参考方案2】:

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

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)


【讨论】:

以上是关于通过 Segue 将数据传递给新的 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

将数据传递给父场景的委托与展开 Segue

在准备 segue 时,如何将数据传递给子 UIViewController?

在函数内将数据传递给 segue.destination 的问题

使用 Storyboard Segue iOS 将数据传递给视图控制器

Swift segue 不会将数据传递给旧的 ViewController

使用 performSegue 将数据传递给目标视图控制器