【问题标题】:Passing Information from one view Controller to another将信息从一个视图控制器传递到另一个视图控制器
【发布时间】:2020-09-22 11:42:52
【问题描述】:

这是我的主要 veiw 控制器代码,我在其中使用我解码的 JSON 数据填充表 veiw,并且我已经准备好需要帮助的 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.
    }




}

所以,如果有帮助,我将不胜感激。这样做的主要目的是,最后如果有人单击带有电影名称的单元格,我想在屏幕上显示电影的名称和overveiw。当我按下表格视图中的一个单元格时,我能够进入新的视图控制器,我只是想知道如何传递值。

【问题讨论】:

标签: ios json swift uitableview segue


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

    var movieData: MovieData?

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

    movieData = decodeData

  3. 根据您的代码和您的问题,我很确定您正在尝试传递有关所选电影的信息,而不是整个结果数组。因此,如果是这种情况,请在 DetViewController 中将影片类型更改为 Result,因为您只对特定影片感兴趣。

    var movie: Result

在 prepareForSegue 中,将所选电影的值分配给您的 DetViewController 的电影属性(这就是您将数据传递给下一个 ViewController 的方式):

 if let indexPath = tableView.indexPathForSelectedRow {
     des.movie = movieData.results[indexPath.row]
 }

现在在您的 DetViewController 中,您可以按如下方式访问标题和概览:movie.title 和 movie.overview

一条建议: 与其命名您的结构 MovieData 和 Result,不如考虑将它们命名为 MovieArray 和 Movie。考虑将其命名为电影,而不是命名您的 MovieData 属性结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多