Swift - 在刷新控制中禁用默认重新加载tableview

时间:2018-03-24 20:20:42

标签: ios swift tableview uirefreshcontrol

我有UIViewController,它将tableview作为子视图。我分配了刷新控件,以便刷新数据。

        refreshControl = UIRefreshControl()
        refreshControl.attributedTitle = NSAttributedString(string: "Loading...")
        refreshControl.addTarget(self, action: #selector(getTableViewData), for: .valueChanged)
        tableView.refreshControl = refreshControl

在getTableViewData中,我有多个API调用来接收要加载到tableview中的要素数据。在getTableViewData函数的末尾,我有一行代码来重新加载tableview。

问题是,一旦检测到下拉,刷新控件似乎会触发重新加载表视图。我想禁用此默认下拉重新加载,以便我可以先收集所有基本数据,然后重新加载。无论如何我还是可以禁用默认重新加载吗?

在getTableViewData中,代码如下所示:

var fetchGroup = DispatchGroup()
@objc func getReceipts(){
    self.refreshControl.beginRefreshing()
    self.dataSet1.removeAll()
    self.dataSet2.removeAll()
    self.dataSet3.removeAll()

    fetchGroup.enter()
    fetchGroup.enter()
    fetchGroup.enter()

    if let fetch1URL = URL(string: "fetchDataSet1", relativeTo: Property.baseURL){
        let headers: HTTPHeaders = [
            "Authorization": Property.shared.token,
            "content-type": "application/json"
        ]
        Property.alamofireManager.request(fetch1URL, headers: headers).responseJSON{ response in
            //Append json data into dataSet1 here...
            self.fetchGroup.leave()
        }
    }else{
        self.fetchGroup.leave()
    }

    if let fetchURL2 = URL(string: "fetchDataSet2", relativeTo: Property.baseURL){
        let headers: HTTPHeaders = [
            "Authorization": Property.shared.token,
            "content-type": "application/json"
        ]
        let params: Parameters = [
            "Temp":""
        ]
        Property.alamofireManager.request(fetchURL2, parameters: params, headers: headers).responseJSON{ response in
            //Append json data into dataSet2 here...
            self.fetchGroup.leave()
        }
    }else{
        self.fetchGroup.leave()
    }

    if let fetch3URL = URL(string: "fetchDataSet3", relativeTo: Property.baseURL){
        let headers: HTTPHeaders = [
            "Authorization": Property.shared.token,
            "content-type": "application/json"
        ]
        let params: Parameters = [
            "Temp":""
        ]
        Property.alamofireManager.request(fetch3URL, parameters: params, headers: headers).responseJSON{ response in
            //Append json data into dataSet3 here...
            self.fetchGroup.leave()
        }
    }else{
        self.fetchGroup.leave()
    }

    fetchGroup.notify(queue: .main, execute: {
        self.refreshControl.endRefreshing()
        print("Going to Refresh")
        self.tableView.reloadData()
    })
}

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用调度组进行API调用。 在调度组的帮助下,您可以在呼叫完成时收到通知。完成通话后,您可以检查是否有任何错误。 如果没有错误,您可以在单元格中重新加载数据。

请查看此链接以供参考: https://dispatchswift.com/introduction-to-dispatch-group-a5cf9d61ff4f

答案 1 :(得分:0)

默认情况下,当您向UIRefreshControl添加UITableView时,刷新控件将在您下拉tableView时进行动画处理并刷新,如果已通过操作将目标添加到刷新控件,选择者'方法将被调用。

如果要手动触发数据提取,则不应向刷新控件添加任何目标。