ios - UILabel 没有在 ViewController swift3 中更新

标签 ios uilabel swift3

我正在解析来自 json 的数据并将它们放入变量然后使用这些变量来更改 UILabel 的值但是它们(UILabel)没有得到更新,我已经通过互联网搜索并且他们说这是结果从主线程以外的线程更新 UIlabel 但在这里我把它放在 viewController 中但仍然没有更新 这是我的代码:

import UIKit

class NewsContentViewController: UIViewController {


    @IBOutlet weak var nuTitle: UILabel!
    var namesArray = String()
    var iD = String()
    var description1 = String()
    var iDArray = [String]()


    @IBOutlet weak var tctView: UITextView!


    override func viewDidLoad() {
        super.viewDidLoad()

        parseJSON()



        nuTitle.text = self.namesArray
        tctView.text = self.description1

        // Do any additional setup after loading the view.
    }




func parseJSON(){



    let requestURL: NSURL = NSURL(string: "XXXXXX" + iD)!
    print(requestURL)
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL as URL)
    let session = URLSession.shared
    let task = session.dataTask(with: urlRequest as URLRequest) {
        (data, response, error) -> Void in


        let readableJSON = JSON(data: data! , options: JSONSerialization.ReadingOptions.mutableContainers, error: nil)





            if let Name = readableJSON[0]["Title"].string as String! {
                var ID = readableJSON[0]["Id"].intValue
                var iDString = String (ID)
                self.namesArray.append(Name)

                var desc = readableJSON[0]["Description"].string as String!
                var type = readableJSON[0]["Type_Name"].string

            self.iDArray.append(iDString)

            self.description1 = desc!
            self.namesArray = Name


        } 
    }
    task.resume()


}


}

最佳答案

问题

这里的问题是parseJSON()里面的任务会异步执行。到那时

nuTitle.text = self.namesArray
tctView.text = self.description1

即将执行,任务尚未返回结果。

请阅读有关 iOS 中线程的更多信息 here

解决方案

对于这种情况,一个合适的解决方案是添加一个 completionBlock,它将返回您的数据。

override func viewDidLoad() {
    super.viewDidLoad()
    
    parseJSON { (description, name) in
        DispatchQueue.main.async {
            self.description1 = description
            self.namesArray = name
            nuTitle.text = self.namesArray
            tctView.text = self.description1
        }
    }
}

func parseJSON(completion: @escaping (_ description: String, _ name: String) -> Void) {
    let requestURL: NSURL = NSURL(string: "XXXXXX" + iD)!
    print(requestURL)
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL as URL)
    let session = URLSession.shared
    let task = session.dataTask(with: urlRequest as URLRequest) {
        (data, response, error) -> Void in
        
        
        let readableJSON = JSON(data: data! , options: JSONSerialization.ReadingOptions.mutableContainers, error: nil)

        if let Name = readableJSON[0]["Title"].string as String! {
            var ID = readableJSON[0]["Id"].intValue
            var iDString = String (ID)
            self.namesArray.append(Name)
            
            var desc = readableJSON[0]["Description"].string as String!
            var type = readableJSON[0]["Type_Name"].string
            
            self.iDArray.append(iDString)
            
            completion(desc!, Name)
        } 
    }
    task.resume()
}

关于ios - UILabel 没有在 ViewController swift3 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422476/

相关文章:

macos - Swift 3 读取终端当前工作目录

ios - iPhone UITableView : How to remove the spacing between sections in group style table?

ios uilabel 尾部截断尾随点颜色

iphone - 最大字体大小 UIFont

ios - 当一个 Label adjustFontSizeToFitWidth 时,在 UITableViewCell 的 UILabels 上设置匹配的字体大小

ios - 带有嵌入式 UIButtons 的 IBDesignable UIView,如何在 Storyboard中连接 Action ?

ios - 动态增加 tableView 中 UIView 的高度

ios - Swift 1.2 数组声明,额外的括号?

iOS Swift 如何访问在完成处理程序闭包中创建的数据——在闭包之外

ios - 更新到 Xcode 8 后 tabBar 和导航栏变暗了