[英]Objective C - Passing JSON data from Tableview to another View Controller
[英]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()
}
}
有幾件事阻礙了你:
現在,在您注釋的代碼中,您嘗試設置的每個屬性都存在類型不匹配的情況。 例如,您嘗試將String
設置為downloadLabel
,它是一個UILabel
。
在prepareForSegue
, IBOutlets
可能沒有加載。
要解決這些問題,您可以在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.