从URL到UITextlabel的Swift4常量

时间:2019-01-23 20:19:00

标签: swift

很抱歉格式化(无法正确显示)

我是Swift4的新手。我设法从URL获取一些JSON数据。尽管我可以打印此信息,但无法在故事板上输出此信息。

我有一个按钮,当我单击它时,数据将被检索并打印到控制台中。我想将此数据放入标签。

我认为这将很简单 self.Label2.text =标题 但是,没有内容添加到Label2。 (实际上,该标签在单击按钮时消失了)

当我在标签中放置文本时,内容确实发生了变化。当我尝试将我的常量输出到情节提要中时,情况并非如此。

有人可以告诉我我在做什么错吗?或指出我正确的方向。预先感谢!

我尝试将Label2的值直接设置到getJsonFromUrl函数中。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var Label1: UILabel!

    @IBOutlet weak var Label2: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    func getJsonFromUrl(){
    navigationItem.title = "REST API"

    guard let url = URL(string: "https://gipaa.nl/com_json.php") else {return}
    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let dataResponse = data,
            error == nil else {
                print(error?.localizedDescription ?? "Response Error")
                return }
        do{
            //here dataResponse received from a network request
            let jsonResponse = try JSONSerialization.jsonObject(with:
                dataResponse, options: [])


            guard let jsonArray = jsonResponse as? [[String: Any]] else{
                return
            }


            guard let title = jsonArray[0]["name"] as? String else{ return }
           print(title)



        } catch let parsingError {
            print("Error", parsingError)
        }
    }
    task.resume()
    }


    @IBAction func Button(_ sender: Any) {

        view.backgroundColor = UIColor.purple

        getJsonFromUrl()

        self.Label2.text = title
        self.Label1.text = "hmm"

    }

}

Label2中标题的值

1 个答案:

答案 0 :(得分:3)

两个主要问题:

  1. guard let title = ...创建一个超出范围的 local 变量。在Button函数中,您分配的title的{​​{1}}属性是完全不同的。
  2. UIViewController中的数据任务异步工作,您必须添加完成处理程序

    getJsonFromUrl

    func getJsonFromUrl(completion: @escaping (String) -> Void) {
    
        ...
    
        guard let title = jsonArray[0]["name"] as? String else { return }
        completion(title)