繁体   English   中英

为什么我的UILabel文本在Xcode 8.1的Swift3中不更改

[英]Why My UILabel Text don't change in Swift3 with Xcode 8.1

我需要每20秒更新一次UILabel文本。 此处一切正常,但我的UILabel不变。

数据也从URL和短语中正确加载。 当我在viewDidLoad尝试self.team1Score = "1" ,它可以工作。

请查看我的代码,并向我建议如何每20秒更改一次UILabel文本。

import UIKit

class WatchLiveVideo: UIViewController {

    @IBOutlet var team1Score: UILabel!
    @IBOutlet var team2Score: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.getScore()
        //run getScore in every 20 Seconds
        _ = Timer.scheduledTimer(timeInterval: 20, target: self, selector: #selector(WatchLiveVideo.self.getScore), userInfo: nil, repeats: true)
    }

    func getScore()
    {
        let myUrl = URL(string: "http://myurl.com");
        var request = URLRequest(url:myUrl!)

        request.httpMethod = "POST"// Compose a query string

        //input data bind to send server
        let streamID = getStreamID

        let postString = "streamID=\(streamID)"

        request.httpBody = postString.data(using: String.Encoding.utf8)

        let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in

            if error != nil
            {
                print("error=\(error)")
                return
            }

            do {
                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

                if let parseJSON = json {
                    let status = parseJSON["status"] as? String
                    let team1 = parseJSON["team1"] as? String
                    let team2 = parseJSON["team2"] as? String

                    if(status == "1")
                    {
                        self.team1Score.text = team1
                        self.team2Score.text = team2 
                    }
                    else if(status == "0")
                    {
                        print("No Score Found")
                    }
                }
            } catch {
                print(error.localizedDescription)
            }
        }
        task.resume()
    }    

}

您需要在主线程中进行UI更新。 因此,请尝试按以下方式包装标签更新代码,以使其在主线程中运行:

DispatchQueue.main.async {
        self.team1Score.text = team1
        self.team2Score.text = team2     
}

我刚刚添加了一个演示项目,以向您说明我提供的答案有效。 我只是举了一个例子,看起来非常像您提供的代码。 正如我上面提到的,我每20秒就远程拨打一次公共休息服务,并更新了主队列中的标签。 您可以下载并运行该应用程序以查看其是否正常运行。

URLSession任务的完成块在后台线程上运行。

您不能从后台线程对UIKit对象进行显示更改。 您当前的代码正在执行此操作,此操作将无效。

您需要在对DispatchQueue.main.async()的调用中,将代码像self.team1Score.text = team1一样包装在完成代码块中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM