json - 将 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
}
解决方案
有几件事妨碍你:
现在,在您的注释代码中,您尝试设置的每个属性都存在类型不匹配。例如,您尝试将 a 设置
String
为downloadLabel
,即 aUILabel
。时
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)
}
}
}
在你的转场中:
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)
}
}
}
推荐阅读
- javascript - 当我尝试点击视频播放 HTML/CSS 时,视频模式不断关闭
- reactjs - 使用完整呈现的 DOM Leaflet 地图测试事件处理程序
- regex - How do I append text to the line containing a substitution in Perl?
- reactjs - 读取json字符串中的单个键值对
- javascript - 下拉后如何将映射值发送到状态属性
- flutter - 在 initstate() 上颤振最佳实践
- html - 为什么不在父元素上创建新的块格式上下文禁用边距折叠?
- javascript - 实时搜索错误
- python - 初学python:获取返回值后自动重新运行函数
- teradata - 如何将变量传递到 Teradata fastexport