加载tableView后停止活动指示器

时间:2017-05-12 03:12:55

标签: ios swift uitableview uiactivityindicatorview

我在尝试停止活动指示器时遇到困难,应该在哪里" self.removeLoadingScreen()"放置?在表视图加载数据后,它会无休止地旋转,我认为将removeLoadingScreen()放在animateTable函数下是理想的,但这是不正确的。

arraylist.push({...obj1});

3 个答案:

答案 0 :(得分:2)

从setLoadingScreen中删除这些行:

self.spinner.startAnimating()
self.myTableView.addSubview(loadingView)

并将它们添加到refreshData:

func refreshData(sender: UIRefreshControl) {

    myTableView.addSubview(loadingView) //here 
    spinner.startAnimating() //also, start the spinner
    myTableView.reloadData()
    refreshControl.endRefreshing()
}

它应该按预期工作。 发生的事情是在viewDidLoad中,当你调用setLoadingScreen时,你不仅设置了loadingView,而且还将它添加到视图层次结构中(从而显示它)。

另外,正如Jitendra所说,不要忘记在完成后删除loadingView。

稍后编辑: 如果你想要的只是一个普通的refreshControl,没有自定义,你可以摆脱大部分代码。您所需要的只是:

声明:

 var refresher: UIRefreshControl!

在viewDidLoad中:

    refresher = UIRefreshControl()
    refresher.addTarget(self, action: "refreshData:", forControlEvents: .ValueChanged)
    tableView.addSubview(refresher)

在refreshData中:

  //get the new data
    refresher.endRefreshing()
    tableView.reloadData()

你不需要" loadingView"," spinner"," loadingLabel",你不需要" setLoadingScreen"和" removeLoadingScreen"功能。 UIRefreshControl将为您完成所有工作。如果有效,请告诉我。

稍后编辑(斯威夫特2)

如果您还希望在首次显示表格时以编程方式启动refreshcontrol,并在获取数据时使其运行:

func showSpinnerWhileFetchingData() {
    refresher.beginRefreshing()
    tableView.setContentOffset(CGPointMake(0, tableView.contentOffset.y - refresher.frame.size.height), animated: true)

    let qualityOfServiceClass = QOS_CLASS_BACKGROUND
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
    dispatch_async(backgroundQueue, {[unowned self] in
        //fetch you data here. you are now on a background queue
        //to quick test it, uncomment the code below 
        //for i in 1...2000 {
        //    self.yourArrayThatIsPopulatingTheTable.append("\(i) hot potatoes")
        //}

        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            self.tableView.reloadData()
            self.refresher.endRefreshing()
        })
    })

}

在viewWillAppear中调用此函数。 并除去animateTable函数,除非你真的想要逐行动画效果,在这种情况下:

  1. 你要么保持原样,并且它不会显而易见(实际上,根本不可见......),但它会使你的UI慢一点

  2. 或者,如果您想花时间并想要交换特效的响应,则必须设置完成处理程序 并在上一个完成动画之后为每一行设置动画,这是另一个主题。

  3. 我希望它有所帮助:)

    编辑最后一次编辑,翻译成Swift 3

    func showSpinnerWhileFetchingData() {
        refresher.beginRefreshing()
    
        tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentOffset.y - refresher.frame.size.height), animated: true)
    
        let qualityOfServiceClass = DispatchQoS.QoSClass.background
        let backgroundQueue = DispatchQueue.global(qos: qualityOfServiceClass)
        backgroundQueue.async(execute: {[unowned self] in
            //fetch you data here. you are now on a background queue
            //to quick test it, uncomment the code below and modify the name of the array to match the array you are using
            //for i in 1...2000 {
            //    self.yourArrayThatIsPopulatingTheTable.append("\(i) hot potatoes")
            //}
            //sleep(5)  //alternately, you can use this to test. don't forget to remove this sleep line after you test
    
            DispatchQueue.main.async(execute: { () -> Void in
                self.tableView.reloadData()
                self.refresher.endRefreshing()
            })
        })
    
    }
    

答案 1 :(得分:0)

完成后,您应该从超级视图中删除loadingView

所以改变你的方法:

fileprivate func removeLoadingScreen() {

self.spinner.stopAnimating()
self.loadingLabel.isHidden = true
//when table have data, after refreshing, remove the loadView from the table view
loadingView.removeFromSuperView()
}

并将此方法称为表格视图刷新完成

func refreshData(sender: UIRefreshControl) {

  myTableView.reloadData()
  refreshControl.endRefreshing()

 //remove loading screen view now
 removeLoadingScreen()

}

答案 2 :(得分:0)

试试这个:

fileprivate func removeLoadingScreen() {    
    self.spinner.stopAnimating() // use this two lines anywhere you need to hide indicator
    loadingView.isHidden = true
}