在 TableView Swift 3 上设置值

Posted

技术标签:

【中文标题】在 TableView Swift 3 上设置值【英文标题】:Set values on TableView Swift 3 on function 【发布时间】:2016-11-02 15:57:52 【问题描述】:

实际上,我需要在我的 TableView 上设置数据,我得到的字符串位于对 WebService 发出 POST 请求的函数上。

override func viewDidLoad() 
    names.append("Data 1")
    names.append("Data 2")
    names.append("Data 3")
    self.request()
    MyTable.delegate = self
    MyTable.dataSource = self
    super.viewDidLoad()

self.request() 功能上,我有一个可以正常工作的发布请求:

func request()

    let parameters: Parameters = [
        "action": "*",
        "key":"*": "*"
    ]
    Alamofire.request("my_url", method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON  response in
        switch response.result 
        case .success(let JSON):
            print("Validation Successful")
            print(response.result.value)
            let response = JSON as! NSDictionary
            let userId = response.object(forKey: "Data")!
            let data = userId as! NSArray
            for item in data  // loop through data items
                let obj = item as! NSDictionary
                print("Obj: \"\(obj["KeyName"] as! String)\"")
                self.names.append(obj["KeyName"] as! String)
            
            print(userId)

        case .failure(let error):
            print(error)
        
    

第一部分工作正常:

names.append("imac")
names.append("Macbook")
names.append("iphon")

print("Obj: \"\(obj["KeyName"] as! String)\"") 在控制台上向我显示字符串,但是当我在 TableView 上设置它时,self.names.append(obj["KeyName"] as! String) 只显示第一部分的数据,我做错了吗?

【问题讨论】:

我猜这是因为它是异步的。因此,一旦获得新名称,您就需要执行MyTable.reloadData()。还要避免命名以大写开头的变量(如MyTable => myTable)。 谢谢这是问题,问候。 【参考方案1】:

每当您将数据更新到数据源时,您都必须重新加载 tableView 以显示新内容。在 for 循环之后添加表重新加载,它应该更新 tableView。由于您的 Alamofire 调用是在不同的线程(主线程除外)中异步执行的,因此请在主线程中更新 tableView。

DispatchQueue.main.async(execute:   
    MyTable.reloadData()  
)

在你的例子中:

func request()

    let parameters: Parameters = [
        "action": "*",
        "key":"*": "*"
    ]
    Alamofire.request("my_url", method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON  response in
        switch response.result 
        case .success(let JSON):
            print("Validation Successful")
            print(response.result.value)
            let response = JSON as! NSDictionary
            let userId = response.object(forKey: "Data")!
            let data = userId as! NSArray
            for item in data  // loop through data items
                let obj = item as! NSDictionary
                print("Obj: \"\(obj["KeyName"] as! String)\"")
                self.names.append(obj["KeyName"] as! String)
            

            DispatchQueue.main.async(execute:   
                MyTable.reloadData()  
            )

            print(userId)

        case .failure(let error):
            print(error)
        
    

【讨论】:

很高兴它有帮助。如果某个答案有助于解决您的问题,您可以将其标记为答案/点赞。

以上是关于在 TableView Swift 3 上设置值的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 tableview 不使用通用完成处理程序显示数据

Swift 3.0 TableView 单元格按钮

Swift 在按钮单击上发送标签文本作为解析对象值

使用 Swift 3.0 中的数据在 Xib 中显示 tableView

Tableview Swift 中的多个计时器

Swift-使用委托在 tableView 上显示