從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」,「微調器「,」加載標籤「,你不需要」setLoadingScreen「和」removeLoadingScreen「功能。 UIRefreshControl將爲您完成所有工作。讓我知道它是否有效。
後來的後來EDIT(斯威夫特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()
})
})
}
調用此函數在看來會出現。 而擺脫animateTable功能,除非你真的想通過排排動畫的效果,在這種情況下:
你要麼讓它因爲它是,它不會是相當明顯的(實際上,根本看不到...),但它會減慢你的用戶界面
或者,如果你想花時間和你想交易特殊效果的響應,你必須設置一個完成處理器 並在上一次完成後爲每一行設置動畫動畫,這是另一個話題。
我希望它能幫助:)
編輯最後的編輯,翻譯成斯威夫特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()
})
})
}
我應該在哪裏把我的新removeLoadingScreen()方法? – user8000557
請參閱編輯答案。 –
我試過了,它仍然不會自行停止,它只會在我下拉刷新表格後停止並消失 – user8000557