Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将信息从一个视图控制器传递到另一个视图控制器_Ios_Json_Swift_Uitableview_Segue - Fatal编程技术网

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

Ios 将信息从一个视图控制器传递到另一个视图控制器,ios,json,swift,uitableview,segue,Ios,Json,Swift,Uitableview,Segue,这是我的主要veiw控制器代码,在这里我用我解码的JSON数据填充表veiw,并且我已经准备好了segue函数,我需要帮助。我想知道如何将电影标题和概述传递给下一个视图控制器: import UIKit class FirstViewController: UIViewController { @IBOutlet weak var tableView: UITableView! var name = [String]() var dis = [String]()

这是我的主要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)
    }
}

 if let indexPath = tableView.indexPathForSelectedRow {
     des.movie = movieData.results[indexPath.row]
 }
下面的代码是我用来解码JSON数据的结构:

import UIKit
struct MovieData:Decodable {
    var results : [Result]
}
struct Result:Decodable {
    var title : String
    var overview:String
}
最后,我有我的目的地veiw控制器,我也在尝试传递我的信息,如电影标题和概述

import UIKit

class DetViewController: UIViewController {

    var movie : MovieData
    override func viewDidLoad() {
        super.viewDidLoad()
print(movie)
        // Do any additional setup after loading the view.
    }




}
如果你能帮忙,我会很感激的。这样做的主要目的是,在最后,如果有人单击带有电影名称的单元格,我希望在屏幕上显示电影的名称和概述。当我按下表视图中的一个单元格时,我就可以进入新的视图控制器,我只是想知道如何传递值

  • 您需要声明一个MovieData类型的变量来保存解码后的数据。我们将其称为movieData,并确保在ViewController的顶部声明它:

    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)
        }
    }
    
    
     if let indexPath = tableView.indexPathForSelectedRow {
         des.movie = movieData.results[indexPath.row]
     }
    
    var movieData:movieData?

  • 在parseJSON()函数中,您希望将解码的数据分配给movieData变量

    movieData=decodeData

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

    var电影:结果

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

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

    一条忠告: 而不是命名你的结构MivieDaA和结果,考虑命名他们电影和电影。而不是命名你的电影属性结果,考虑命名它的电影。希望这有帮助!