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

Posted

技术标签:

【中文标题】Swift - 在刷新控件中禁用默认重新加载表视图【英文标题】:Swift - disable default reload tableview in refresh control 【发布时间】:2018-03-24 20:20:42 【问题描述】:

我有 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。

问题在于,refreshcontrol 似乎在检测到下拉后立即触发重新加载表视图。我想禁用此默认下拉重新加载,以便我可以首先收集所有基本数据然后重新加载。无论如何我可以禁用默认重新加载吗?

在 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()
    )

谢谢!

【问题讨论】:

可以分享getTableViewData方法的代码吗? @J.Koush 我发布了代码。基本上我使用 dispatchgroup 使用 Alamofire 获取数据。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

所以你的意思是在不开始重新加载的情况下不可能通过下拉触发特定功能?或者如果添加目标触发器重新加载,那么我应该如何处理它以便我可以在下拉时调用函数?任何提示或建议将不胜感激 不,你不能,UIRefreshControl 的创建目的是在用户下拉 tableView 时进行刷新,以指示用户正在进行重新加载操作。 好的。我会寻求更好的方法。谢谢! 其实只是tableview在编辑数据集时因为tableview弹跳而试图重用cell...

以上是关于Swift - 在刷新控件中禁用默认重新加载表视图的主要内容,如果未能解决你的问题,请参考以下文章

Swift:重新加载视图控制器

如何重新加载UIPageViewController以在Swift中重新加载其视图

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

如何重新加载 UIPageViewController 以在 Swift 中重新加载其视图

Swift:在警报视图中按下按钮后,tableView 不会重新加载数据

Swift - 在 vi​​ewDidAppear 中使用新信息重新加载 UIPageViewController