REST API:无法填充 Tableview

Posted

技术标签:

【中文标题】REST API:无法填充 Tableview【英文标题】:REST API: Cannot populate Tableview 【发布时间】:2016-05-12 01:01:22 【问题描述】:

我正在尝试从 api 中提取数据以填充我的表格,但没有显示任何内容。我该如何解决?

更新 当我将 GET 请求放在 viewDidLoad() 或 viewDidAppear() 中时,我会收到一个空数组

GET 的结果是 []

我尝试将 self.tableView.reload() 添加到 viewDidLoad() 但会抛出此错误

对成员 'tableView(_:numberOfRowsInSection:)' 的不明确引用

这是我的 JSON 响应

[

"schedule_job_id": 23,
"start_date": "2016-05-01",
"end_date": "2016-05-08",
"building_id": 2,
"building_name": "Republic Plaza",
"building_block_no": "69A",
"building_street_name": "9 Raffles Place Downtown Core",
"building_postal_code": "233645",
"checklist_id": "1",
"checklist_name": "Lightning protection",
"checklist_due_date": "2016-04-12 17:00:00",
"tasks": [
  
    "submission_id": 105,
    "task_id": "1",
    "task_name": "Inspect Carpark",
    "task_checked": true,
    "task_submitted_date": "2016-05-04 04:39:01",
    "task_comment": null,
    "task_building_level": "1",
    "task_description": "",
    "task_status": "OK",
    "total_rating": null,
    "safety_ratings": [
      
        "submission_id": 105,
        "safety_rating_id": 79,
        "task_id": "1",
        "name": "Equipment",
        "points": "10",
        "score": "0"
      
    ],
    "photos": []
  
]

这是我的 GET 请求

override func viewDidLoad() 
    usernameLabel.text = Data.sharedInstance.userName
    let url = "http://anyapi.com"
    Alamofire.request(.GET, url).validate().responseJSON  response in
        switch response.result 
        case .Success(let data):
            let json = JSON(data)
            if let data = json["task_name"].arrayValue as [JSON]?
                self.datas = data
                self.displayTask.reloadData()
                print("result of GET is \(self.datas)")
            
        case .Failure(let error):
            print("Request failed with error: \(error)")
        
    


完整的tableview代码可以看这里https://codeshare.io/aKknb

【问题讨论】:

【参考方案1】:

似乎 json["task_name"] 不是数组,也不是第一级,而是任务数组中对象的属性,这就是你得到一个空数组的原因。

如果你打算在你的 tableview 中显示任务,你应该这样做

if let data = json["tasks"].arrayValue as [JSON]?

【讨论】:

【参考方案2】:

因为发出 HTTP 请求的代码使用了错误的方法。你打算把它放在 viewDidLoad() 中,但你实际上把它放在了 didReceiveMemoryWarning() 中

【讨论】:

嗨@Brett 我已将我的代码移至 viewDidLoad() 但它仍然没有填充 您的打印语句将哪些内容打印到您的日志中? 请记住,在 viewDidLoad 中,视图还不可见。当然,它们可能在您的异步服务器请求返回时存在,但可能不存在。所以这可能是一个时间问题。您可以将代码移至 viewDidAppear 进行检查。 我已经尝试将它放在 viewDidAppear() 中,但我的控制台输出仍然是“GET 的结果是 []” 那么您的 JSON 结构可能就是问题所在。尝试将 json 变量打印到控制台。您的***结构是您有一个包含一个对象的数组,该对象具有一个任务数组属性,该属性也具有一个对象,并且该对象具有“task_name”属性。我不知道 json["task_name"].arrayValue 是什么意思,但我猜这就是你失败的地方。从更简单的 JSON 字符串开始并从那里开始工作可能是一个想法。【参考方案3】:

与其将填充放在 viewDidLoad 中,不如在 viewDidAppear 中尝试...这样 tableview 已全部设置好并能够正确填充。

【讨论】:

【参考方案4】:

您可以在 ViewWillAppear 中启动 HTTP 请求并重新加载 tableview。这样才能正确加载 tableview。

【讨论】:

以上是关于REST API:无法填充 Tableview的主要内容,如果未能解决你的问题,请参考以下文章

无法为 rest api 手动设置查询参数(使用 mux)

带有 REST API 的 AsyncTask

使用 Wordpress Rest API JS 填充 ACF 字段

显示rest api json响应,如使用angular js的文本框自动填充

如何使用flutter Dropdown小部件从Django REST API端点填充数据

从 REST API 填充上下文并在带有 useEffect 和 useContext 的 React 组件中使用它