我在尝试停止活动指示器时遇到困难,应该在哪里" self.removeLoadingScreen()"放置?在表视图加载数据后,它会无休止地旋转,我认为将removeLoadingScreen()放在animateTable函数下是理想的,但这是不正确的。
arraylist.push({...obj1});
答案 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函数,除非你真的想要逐行动画效果,在这种情况下:
你要么保持原样,并且它不会显而易见(实际上,根本不可见......),但它会使你的UI慢一点
或者,如果您想花时间并想要交换特效的响应,则必须设置完成处理程序 并在上一个完成动画之后为每一行设置动画,这是另一个主题。
我希望它有所帮助:)
编辑最后一次编辑,翻译成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
}