通过 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]
,这将不起作用,请决定是需要Result
s 的数组还是只需要一个。
【讨论】:
如果我尝试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 时,如何将数据传递给子 UIViewController?
在函数内将数据传递给 segue.destination 的问题
使用 Storyboard Segue iOS 将数据传递给视图控制器