像刷新一样重新加载tableview视图

Posted

技术标签:

【中文标题】像刷新一样重新加载tableview视图【英文标题】:reload tableview view like refresh 【发布时间】:2019-01-17 11:01:19 【问题描述】:

我正在使用 json 数据填充 tableview 及其工作成功,但现在我想在刷新按钮上更新 tableview 单击刷新按钮我再次调用现有的 func 我创建调用 api 让我向您展示我的代码

代码

func OverdueList()
    let preferences = UserDefaults.standard
    let uid = "u_id"
    let acTkn = "acc_tkn"

    let u_ID = preferences.object(forKey: uid)
    let A_Token = preferences.object(forKey: acTkn)

    let params = ["user_id": u_ID!, "access_token": A_Token!]
    print(params)
    SVProgressHUD.show()
    Alamofire.request(inspectionsList, method: .post, parameters: params).responseJSON(completionHandler: (response) in
        switch response.result
        case.success(let value):
            let json  = JSON(value)
            print(json)
            let data = json["inspections_overdue_data"]
            print(data)
            if data == []
                self.viewNodata.isHidden = false
            else
                data.array?.forEach( (iunOverDue) in
                    let iOveList = OvedueModel(surveyor_id: iunOverDue["surveyor_id"].stringValue, country: iunOverDue["country"].stringValue, time: iunOverDue["time"].stringValue, address2: iunOverDue["address2"].stringValue, address3: iunOverDue["address3"].stringValue, notes: iunOverDue["notes"].stringValue, house_num: iunOverDue["house_num"].stringValue, name: iunOverDue["name"].stringValue, address1: iunOverDue["address1"].stringValue, latitude: iunOverDue["latitude"].stringValue, eircode: iunOverDue["eircode"].stringValue, date_inspected: iunOverDue["date_inspected"].stringValue, property_id: iunOverDue["property_id"].stringValue, county: iunOverDue["county"].stringValue, client_id: iunOverDue["client_id"].stringValue, longitude: iunOverDue["longitude"].stringValue)
                    self.searchResult = self.overDueData
                    self.overDueData.append(iOveList)
                )

                self.tblOvedue.reloadData()
            
            SVProgressHUD.dismiss()
        case.failure(let error):
            print(error.localizedDescription)
        

    )

我调用这个函数来填充表格视图,我正在做如下操作

@IBAction func btnRefreshTapped(_ sender: UIButton) 
      OverdueList()
    

问题是在重新调用这个函数后,数据一次又一次地重复,我该如何解决这个问题?

【问题讨论】:

与您的问题无关,但是:在 Swift 中,类型应该以大写字母开头,变量/常量/方法以小写开头:OverdueLis() -> overdueList()。接下来,不要在Swift中使用snake_case,使用camelCase:u_ID -> uID。最后,尽量避免使用 SwiftyJSON,因为您可以使用推荐的Codable 来解码和编码数据。 【参考方案1】:

请试试这个代码:

func OverdueList()


    let preferences = UserDefaults.standard
    let uid = "u_id"
    let acTkn = "acc_tkn"

    let u_ID = preferences.object(forKey: uid)
    let A_Token = preferences.object(forKey: acTkn)

    let params = ["user_id": u_ID!, "access_token": A_Token!]
    print(params)
    SVProgressHUD.show()
    Alamofire.request(inspectionsList, method: .post, parameters: params).responseJSON(completionHandler: (response) in
        switch response.result
        case.success(let value):
            self.overDueData.removeAll()
            let json  = JSON(value)
            print(json)
            let data = json["inspections_overdue_data"]
            print(data)
            if data == []
                self.viewNodata.isHidden = false
            else
                data.array?.forEach( (iunOverDue) in
                    let iOveList = OvedueModel(surveyor_id: iunOverDue["surveyor_id"].stringValue, country: iunOverDue["country"].stringValue, time: iunOverDue["time"].stringValue, address2: iunOverDue["address2"].stringValue, address3: iunOverDue["address3"].stringValue, notes: iunOverDue["notes"].stringValue, house_num: iunOverDue["house_num"].stringValue, name: iunOverDue["name"].stringValue, address1: iunOverDue["address1"].stringValue, latitude: iunOverDue["latitude"].stringValue, eircode: iunOverDue["eircode"].stringValue, date_inspected: iunOverDue["date_inspected"].stringValue, property_id: iunOverDue["property_id"].stringValue, county: iunOverDue["county"].stringValue, client_id: iunOverDue["client_id"].stringValue, longitude: iunOverDue["longitude"].stringValue)
                    self.searchResult = self.overDueData
                    self.overDueData.append(iOveList)
                )

                self.tblOvedue.reloadData()
            
            SVProgressHUD.dismiss()
        case.failure(let error):
            print(error.localizedDescription)
        

    )

这可能对你有帮助,谢谢。

【讨论】:

现在清除dataSource 还为时过早。最好将其移动到 success case 中,以便在要填充新数据时进行。 请点击对勾接受我的回答。以便其他用户可以得到帮助。谢谢【参考方案2】:

清除这里

case.success(let value):
let json  = JSON(value)
print(json)
let data = json["inspections_overdue_data"]
print(data)
if data == []
    self.viewNodata.isHidden = false
else
    self.overDueData.removeAll()
    data.array?.forEach( (iunOverDue) in
        let iOveList = OvedueModel(surveyor_id: iunOverDue["surveyor_id"].stringValue, country: iunOverDue["country"].stringValue, time: iunOverDue["time"].stringValue, address2: iunOverDue["address2"].stringValue, address3: iunOverDue["address3"].stringValue, notes: iunOverDue["notes"].stringValue, house_num: iunOverDue["house_num"].stringValue, name: iunOverDue["name"].stringValue, address1: iunOverDue["address1"].stringValue, latitude: iunOverDue["latitude"].stringValue, eircode: iunOverDue["eircode"].stringValue, date_inspected: iunOverDue["date_inspected"].stringValue, property_id: iunOverDue["property_id"].stringValue, county: iunOverDue["county"].stringValue, client_id: iunOverDue["client_id"].stringValue, longitude: iunOverDue["longitude"].stringValue)
        self.searchResult = self.overDueData
        self.overDueData.append(iOveList)
    )

    self.tblOvedue.reloadData()

你也可以将数组声明为Set来移除相似的对象

【讨论】:

按钮或回调内部【参考方案3】:

这很简单...只是因为在刷新时您正在调用“OverdueList”,但未能从 overDueData 数组中清除数据。这就是您重复获取数据的原因。

为此,您只需简单地执行此操作即可。

@IBAction func btnRefreshTapped(_ sender: UIButton)     
     self.overDueData.removeAll()
     self.OverdueList()    

【讨论】:

以上是关于像刷新一样重新加载tableview视图的主要内容,如果未能解决你的问题,请参考以下文章

modalview 关闭后 TableView 未重新加载

Swift - 在刷新控件中禁用默认重新加载表视图

以编程方式加载自定义子视图,就像它们是单元格一样?

导航到 Swift tabBar 时不会刷新视图

删除firebase中的数据后如何刷新TableViewCell?

如何在单元格 Swift 2 中删除项目后重新加载表格视图