将信息从一个视图控制器传递到另一个视图控制器

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 视图中的一个单元格时,我能够进入新的视图控制器,我只是想知道如何传递值。

  1. 您需要声明一个 MovieData 类型的变量来保存您的解码数据。我们称它为 movieData 并确保在 ViewController:

    的顶部声明它

    var movieData: MovieData?

  2. 在您的 parseJSON() 函数内部,您想将解码后的数据分配给您的 movieData 变量。

    movieData = decodeData

  3. 根据您的代码和您的问题,我很确定您正在尝试传递有关所选电影的信息,而不是整个结果数组。所以,如果是这种情况,在 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 结果命名为 属性,而是考虑将其命名为电影。