首页 > 解决方案 > 将 JSON 传递给另一个视图控制器

问题描述

我很难尝试使用 segue 将 JSON 传递给另一个视图控制器。因此,因为我只能使用准备(用于 segue,发件人),但我无法让我的数据填充我的视图控制器上的插座。下面是我的第一个视图控制器。在 prepare(for segue, sender) 方法中,您可以看到我注释掉的代码不起作用。有什么建议吗?

类 ViewController2:UIViewController,UITableViewDelegate,UITableViewDataSource {

var pictures : [Hit] = []


@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    
    tableView.delegate = self
    tableView.dataSource = self
    
    NetworkMananger.shared.getInfo { [weak self] (results) in
        guard let self = self else {return }
        
        switch results {
        
        case .failure(let error):
            print(error)
            
        case .success(let pictures):
            self.pictures = pictures
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    }
    
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ViewController1"{
        if let indexPath = self.tableView.indexPathForSelectedRow{
            let vc = segue.destination as! ViewController1
            //                vc.downloadLabel = String(pictures[indexPath.row].downloads)
            //                vc.tagsLabel = pictures[indexPath.row].tags
            //                vc.imageData = UIImage(named: pictures[indexPath.row].previewURL)
        }
        
    }
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    let vc = storyboard?.instantiateViewController(identifier: "ViewController1") as? ViewController1
    
    navigationController?.pushViewController(vc!, animated: true)
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return pictures.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell123", for: indexPath) as! firstTableViewCell
    cell.label?.text = String(pictures[indexPath.row].downloads)
    cell.downloadPictureFromURL(from: pictures[indexPath.row].previewURL)
    
    return cell
    
}

}

下面是我想将 JSON 传递给的第二个视图控制器:

类 ViewController1: UIViewController {

var picture : Hit!



@IBOutlet weak var label: UILabel!

@IBOutlet weak var imageData:
    UIImageView!
@IBOutlet weak var tagsLabel: UILabel!


@IBOutlet weak var downloadLabel: UILabel!
var cap : String = ""

override func viewDidLoad() {
    super.viewDidLoad()


}

}

JSON

  struct Response : Codable {
  let hits : [Hit]
  }

 struct Hit : Codable  {
 let tags : String
 let previewURL : String
 let downloads : Int
 }

标签: jsonswiftuitableviewsegueviewcontroller

解决方案


有几件事妨碍你:

  1. 现在,在您的注释代码中,您尝试设置的每个属性都存在类型不匹配。例如,您尝试将 a 设置StringdownloadLabel,即 a UILabel

  2. prepareForSegueIBOutlets可能无法加载。

要解决这些问题,您可以设置属性ViewController1,然后在以下位置初始化视图viewDidLoad

struct ViewController1Input {
    var downloadLabelText : String
    var tagsLabelText: String
    var imageName: String
}

class ViewController1: UIViewController {
    var picture : Hit! //careful here -- I'm not sure where this is coming from and you aren't setting it in your segue
    
    var input : ViewController1Input?
    
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var imageData: UIImageView!
    @IBOutlet weak var tagsLabel: UILabel!
    @IBOutlet weak var downloadLabel: UILabel!
    var cap : String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if let input = input {
            downloadLabel.text = input.downloadLabelText
            tagsLabel.text = input.tagsLabelText
            imageData.image = UIImage(named: input.imageName)
        }
    }
}

在你的转场中:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ViewController1"{
        if let indexPath = self.tableView.indexPathForSelectedRow{
            let vc = segue.destination as! ViewController1
            vc.input = ViewController1Input(downloadLabelText: String(pictures[indexPath.row].downloads),
                                            tagsLabelText: pictures[indexPath.row].tags,
                                            imageName: pictures[indexPath.row].previewURL)
        }
        
    }
}

推荐阅读