Константа Swift4 из URL в UITextlabel - PullRequest
0 голосов
/ 23 января 2019

Извините за форматирование (не могу понять, правильно)

Я новичок в Swift4. Мне удалось получить некоторые данные JSON из URL. Хотя я могу распечатать эту информацию, я не смог вывести эту информацию на свою раскадровку.

У меня есть кнопка, и когда я нажимаю на нее, данные извлекаются и печатаются в консоли. Я хочу поместить эти данные в метку.

Я думал, что это будет так же просто, как self.Label2.text = title Но контент не добавляется в 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 голосов
/ 23 января 2019

Две основные проблемы:

  1. guard let title = ... создает переменную local , которая выходит за пределы области видимости.В функции Button вы присваиваете title свойство UIViewController, которое является чем-то совершенно другим.
  2. Задача данных в getJsonFromUrl работает асинхронно, вы должны добавить завершениеобработчик

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

    @IBAction func button(_ sender: Any) { // function names are supposed to start with a lowercase letter
        getJsonFromUrl { title in 
           self.Label2.text = title
        }
    ...
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...