【问题标题】:Set values on TableView Swift 3 on function在 TableView Swift 3 上设置值
【发布时间】: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)。
  • 谢谢这是问题,问候。

标签: swift xcode uitableview tableview alamofire


【解决方案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)
        }
    }
}

【讨论】:

  • 很高兴它有帮助。如果某个答案有助于解决您的问题,您可以将其标记为答案/点赞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多