将信息从一个视图控制器传递到另一个视图控制器
Passing Information from one view Controller to another
这是我的主要 Veiw 控制器代码,我在其中填充 table Veiw,其中包含我解码的 JSON 数据,并且我已准备好需要帮助的 segue 函数。我想知道将电影的标题和概述传递给下一个视图控制器:
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var name = [String]()
var dis = [String]()
let urls = "https://api.themoviedb.org/3/movie/top_rated?api_key=964086a2711d5d6f3fa828013fd5c3b0&language=en-US&page=1"
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(UINib(nibName: "Mov", bundle: nil), forCellReuseIdentifier: "hello")
session()
// Do any additional setup after loading the view.
}
func session(){
let session = URLSession(configuration: .default, delegate: nil, delegateQueue: .main)
let url = URL(string: urls)!
let task = session.dataTask(with: url, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) -> Void in
if (error != nil){
print(error!)
return
}
if let safeData = data{
self.parseJSON(movieData:safeData)
}
})
task.resume()
}
func parseJSON (movieData :Data){
let decoder = JSONDecoder()
do{
let decodeData = try decoder.decode(MovieData.self, from: movieData)
for movie in decodeData.results {
self.name.append(movie.title)
self.dis.append(movie.overview)
self.tableView.reloadData()
//print(movie.overview)
self.tableView.reloadData()
}
// print("\(self.name)")
//print(self.name.count)
}catch{
print(error)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let des = segue.destination as! DetViewController
}
}
extension FirstViewController:UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//print(name.count)
return name.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "hello", for: indexPath) as! Mov
cell.topLabel.text = self.name[indexPath.row]
cell.bottomLabel.text=self.dis[indexPath.row]
return cell
}
}
extension FirstViewController:UITableViewDelegate{
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "dhruv", sender: self)
}
}
下面的代码是我用来解码我的 JSON 数据的结构:
import UIKit
struct MovieData:Decodable {
var results : [Result]
}
struct Result:Decodable {
var title : String
var overview:String
}
最后我有我的目标视图控制器,我也试图通过它传递我的信息,例如电影标题和概述;
import UIKit
class DetViewController: UIViewController {
var movie : MovieData
override func viewDidLoad() {
super.viewDidLoad()
print(movie)
// Do any additional setup after loading the view.
}
}
所以,如果能帮上忙,我将不胜感激。这样做的主要目的是,最后如果有人单击带有电影名称的单元格,我想在屏幕上显示电影的名称和概述。当我按下 table 视图中的一个单元格时,我能够进入新的视图控制器,我只是想知道如何传递值。
您需要声明一个 MovieData 类型的变量来保存您的解码数据。我们称它为 movieData 并确保在 ViewController:
的顶部声明它
var movieData: MovieData?
在您的 parseJSON() 函数内部,您想将解码后的数据分配给您的 movieData 变量。
movieData = decodeData
根据您的代码和您的问题,我很确定您正在尝试传递有关所选电影的信息,而不是整个结果数组。所以,如果是这种情况,在 DetViewController 中,将电影类型更改为结果,因为您只对特定电影感兴趣。
var movie: Result
在 prepareForSegue 中,将所选电影的值分配给您的 DetViewController 的电影 属性(这就是您将数据传递给下一个 ViewController 的方式):
if let indexPath = tableView.indexPathForSelectedRow {
des.movie = movieData.results[indexPath.row]
}
现在在您的 DetViewController 中,您可以按如下方式访问标题和概述:movie.title 和 movie.overview
一条建议:
考虑将它们命名为 MovieArray 和 Movie,而不是命名您的结构 MovieData 和 Result。不要将 MovieData 结果命名为 属性,而是考虑将其命名为电影。
这是我的主要 Veiw 控制器代码,我在其中填充 table Veiw,其中包含我解码的 JSON 数据,并且我已准备好需要帮助的 segue 函数。我想知道将电影的标题和概述传递给下一个视图控制器:
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var name = [String]()
var dis = [String]()
let urls = "https://api.themoviedb.org/3/movie/top_rated?api_key=964086a2711d5d6f3fa828013fd5c3b0&language=en-US&page=1"
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(UINib(nibName: "Mov", bundle: nil), forCellReuseIdentifier: "hello")
session()
// Do any additional setup after loading the view.
}
func session(){
let session = URLSession(configuration: .default, delegate: nil, delegateQueue: .main)
let url = URL(string: urls)!
let task = session.dataTask(with: url, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) -> Void in
if (error != nil){
print(error!)
return
}
if let safeData = data{
self.parseJSON(movieData:safeData)
}
})
task.resume()
}
func parseJSON (movieData :Data){
let decoder = JSONDecoder()
do{
let decodeData = try decoder.decode(MovieData.self, from: movieData)
for movie in decodeData.results {
self.name.append(movie.title)
self.dis.append(movie.overview)
self.tableView.reloadData()
//print(movie.overview)
self.tableView.reloadData()
}
// print("\(self.name)")
//print(self.name.count)
}catch{
print(error)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let des = segue.destination as! DetViewController
}
}
extension FirstViewController:UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//print(name.count)
return name.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "hello", for: indexPath) as! Mov
cell.topLabel.text = self.name[indexPath.row]
cell.bottomLabel.text=self.dis[indexPath.row]
return cell
}
}
extension FirstViewController:UITableViewDelegate{
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "dhruv", sender: self)
}
}
下面的代码是我用来解码我的 JSON 数据的结构:
import UIKit
struct MovieData:Decodable {
var results : [Result]
}
struct Result:Decodable {
var title : String
var overview:String
}
最后我有我的目标视图控制器,我也试图通过它传递我的信息,例如电影标题和概述;
import UIKit
class DetViewController: UIViewController {
var movie : MovieData
override func viewDidLoad() {
super.viewDidLoad()
print(movie)
// Do any additional setup after loading the view.
}
}
所以,如果能帮上忙,我将不胜感激。这样做的主要目的是,最后如果有人单击带有电影名称的单元格,我想在屏幕上显示电影的名称和概述。当我按下 table 视图中的一个单元格时,我能够进入新的视图控制器,我只是想知道如何传递值。
您需要声明一个 MovieData 类型的变量来保存您的解码数据。我们称它为 movieData 并确保在 ViewController:
的顶部声明它var movieData: MovieData?
在您的 parseJSON() 函数内部,您想将解码后的数据分配给您的 movieData 变量。
movieData = decodeData
根据您的代码和您的问题,我很确定您正在尝试传递有关所选电影的信息,而不是整个结果数组。所以,如果是这种情况,在 DetViewController 中,将电影类型更改为结果,因为您只对特定电影感兴趣。
var movie: Result
在 prepareForSegue 中,将所选电影的值分配给您的 DetViewController 的电影 属性(这就是您将数据传递给下一个 ViewController 的方式):
if let indexPath = tableView.indexPathForSelectedRow {
des.movie = movieData.results[indexPath.row]
}
现在在您的 DetViewController 中,您可以按如下方式访问标题和概述:movie.title 和 movie.overview
一条建议: 考虑将它们命名为 MovieArray 和 Movie,而不是命名您的结构 MovieData 和 Result。不要将 MovieData 结果命名为 属性,而是考虑将其命名为电影。