簡體   English   中英

將 JSON 傳遞給另一個視圖控制器

[英]Passing JSON to another view controller

我很難嘗試使用 segue 將 JSON 傳遞給另一個視圖控制器。 所以我只能使用prepare(for segue,sender),但我無法讓我的數據填充我的視圖控制器上的插座。 下面是我的第一個視圖控制器。 在 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()


}

}

有幾件事阻礙了你:

  1. 現在,在您注釋的代碼中,您嘗試設置的每個屬性都存在類型不匹配的情況。 例如,您嘗試將String設置為downloadLabel ,它是一個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)
        }
    }
}

在你的segue中:

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)
        }
        
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM