无法将 JSON 值传输到 SecondViewController 中的标签

Posted

技术标签:

【中文标题】无法将 JSON 值传输到 SecondViewController 中的标签【英文标题】:Cannot transfer JSON value to Label in SecondViewController 【发布时间】:2018-08-18 22:54:46 【问题描述】:

我正在尝试通过按下主视图控制器中的按钮将 JSON 值传输到另一个视图控制器中的标签。我的第一个视图控制器称为“ViewController”,第二个称为“AdvancedViewController”。下面的代码显示了我如何获取 JSON 数据,它工作正常,在 MainViewController 中的标签中显示 JSON 值,但是当我将 JSON 值发送到 AdvancedViewController 中的标签时,我按下按钮,它会加载AdvancedViewController 但标签值没有改变?我已经在我的 AdvancedViewController 中分配了标签,但我不确定它为什么不起作用。我正在尝试将其转移到高级视图控制器中的值“avc.Label”

主标签代码显示了我如何让它在我的 MainViewController 中工作

代码如下:

我的主视图控制器:

 guard let APIUrl = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=" + text +  "&appid=e7b2054dc37b1f464d912c00dd309595&units=Metric") else  return 
        //API KEY

        URLSession.shared.dataTask(with: APIUrl)  data, response, error in
            guard let data = data else  return 


            let decoder = JSONDecoder()
            //Decoder

            do 
                let weatherData = try decoder.decode(MyWeather.self, from: data)

                if (self.MainLabel != nil)
                
                    if let gmain =  (weatherData.weather?.first?.main)  //using .first because Weather is stored in an array
                        print(gmain)
                        DispatchQueue.main.async 
                            self.MainLabel.text! = String (gmain)
                        
                    

                

                let avc = AdvancedViewController(nibName: "AdvancedViewController", bundle: nil)

                if (avc.Label != nil)
                
                    if let mTest =  (weatherData.weather?.first?.myDescription)  //using .first because Weather is stored in an array
                        DispatchQueue.main.async 
                            avc.Label.text! = String (mTest)
                                                    
                    
                

【问题讨论】:

【参考方案1】:

AdvancedViewController中创建存储mTest值的变量

class AdvancedViewController: ViewController 

    var test: String!

    override func viewDidLoad()
        super.viewDidLoad()

        if let test = test 
            myLabel.text = test
        
    





let vc = storyboard?.instantiateViewController(withIdentifier: "AdvancedViewController") as! AdvancedViewController
if let mTest =  (weatherData.weather?.first?.myDescription) 
    vc.test = mTest

DispatchQueue.main.async 
    present(vc, animated: true, completion: nil)

【讨论】:

我无法让任何代码工作,它无法识别“weatherData”,它不接受“let vc”,也找不到“mTest”【参考方案2】:

您不应该尝试操纵另一个视图控制器的视图。这违反了封装的OO原则。 (有时它只是简单地不起作用,就像你的情况一样。)

Salman 告诉你如何解决它。将 String 属性添加到另一个视图控制器,然后在该视图控制器的 viewWillAppear 中,将字符串值安装到所需的标签中(或对信息执行任何适当的操作。)

【讨论】:

以上是关于无法将 JSON 值传输到 SecondViewController 中的标签的主要内容,如果未能解决你的问题,请参考以下文章

通过 AJAX 将 JSON 数据发布到 Web API 失败,并显示“无法将 JSON 值转换为 System.Int32”

RestTemplate传输值为null的属性利用FastJson将属性中有空值null的对象转化成Json字符串

将 JSON 流式传输到 Bigquery

json对象

跨浏览器 HTML5 拖放 JSON 数据传输失败

无法将 JSON 响应添加到领域