【问题标题】:Activity indicator not showing in pagination for tableview in Swift活动指示器未显示在 Swift 中 tableview 的分页中
【发布时间】:2022-02-12 02:10:27
【问题描述】:

我正在为 tableview 使用分页,因为我已经为 tableview 页脚创建了微调器并在 scrollViewDidEndDragging 中调用它,但微调器没有显示.. 分页时

代码:使用此代码分页可以工作,但createSpinnerFooter 正在调用但没有显示,为什么?我哪里错了。请指导我

 var currentPageNumberVM: Int = 1
 private func createSpinnerFooter() -> UIView {
    
    let footerView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 100))
    
    let spinner = UIActivityIndicatorView()
    spinner.center = footerView.center
    footerView.addSubview(spinner)
    spinner.startAnimating()
    return footerView
   }

   //and calling here
   func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {

     //Bottom Refresh
     if scrollView == resultTableView{

        if (((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height))
        //if scrollView.contentOffset.y > (resultTableView.contentSize.height-100-scrollView.frame.size.height)
        {
            resultTableView.tableFooterView = createSpinnerFooter()
            print("refresh called")
            self.refresh()
        }
    }
    }

   @objc func refresh() {
    if currentPageNumberVM <= searchData?.result?.jobs?.last_page ?? 1 {
        jobSearchResultServiceCall()//service call
        
    } else {
        self.view.makeToast("No more data to show")
    resultTableView.tableFooterView = nil

    }
   }

编辑:如果我将 resultTableView.tableFooterView = nil 移动到 else 则问题是 createSpinnerFooter 正在显示,但是一旦加载然后单元格不重新加载,我的意思是在我再次滚动之前分页不起作用,为什么?问题出在哪里。

【问题讨论】:

    标签: swift uitableview pagination uiscrollview uiactivityindicatorview


    【解决方案1】:

    这是因为 resultTableView.tableFooterView = nil 在您的 refresh() 函数中导致微调器在添加后立即被删除。

    方法如下

    1. 首先在scrollViewDidEndDragging 中添加微调器,使用这行代码resultTableView.tableFooterView = createSpinnerFooter()
    2. 然后您立即调用self.refresh(),我相信这会在后台调用 API
    3. 但是,在refresh 中,您也是nil API 调用完成之前的页脚视图resultTableView.tableFooterView = nil

    这一切发生得如此之快,以至于您看不到微调器被添加和移除。

    resultTableView.tableFooterView = nil 这一行应该放在您的 else 案例中,并且应该在 API 返回响应或错误后进入您的 API 完成处理程序

    更新

    您需要将resultTableView.tableFooterView = nil 移动到两个位置。

    一个在 else 块中 - 好的,你已经完成了。

    另一个在您的 API 调用的完成处理程序中。您的 API 调用似乎无法处理完成,因此我建议您查看 resource 1resource 2 以了解如何为您的 API 调用设置完成处理程序。

    完成处理程序会在您的 api 调用完成时通知您,这是您需要将微调器设为 nil 的第二个地方。

    您需要使用上面的链接更改您的 jobSearchResultServiceCall() 以获得完成处理程序。

    完成后,您将拥有如下所示的代码

    @objc func refresh() {
    
        if currentPageNumberVM <= searchData?.result?.jobs?.last_page ?? 1 {
    
            jobSearchResultServiceCall { [weak self] _ in
                // your API call has finished and here is the second place
                // to remove the spinner
                self?.resultTableView.tableFooterView = nil
            })
            
        } else {
            self.view.makeToast("No more data to show")
            resultTableView.tableFooterView = nil
        }
    }
    

    现在,如果 api 调用已完成或没有更多结果可显示,您的微调器将被关闭

    【讨论】:

    • 感谢回复
    • 如果我将 resultTableView.tableFooterView = nil 移动到 else 那么问题是 createSpinnerFooter 正在显示,但是一旦它的负载然后单元格没有重新加载我的意思是分页在我再次滚动之前不起作用,为什么?问题出在哪里。
    • 请看我更新的答案。您需要在代码中引入完成处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多