2017-05-12 57 views
2

我在嘗試停止活動指示器時很困難,應該在哪裏放置「self.removeLoadingScreen()」?它在表視圖加載數據後無休止地旋轉,我認爲將removeLoadingScreen()放在animateTable函數下是理想的,但這是不正確的。加載tableView後停止活動指示器

var refresher: UIRefreshControl! 

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

    let qualityOfServiceClass = QOS_CLASS_BACKGROUND 

    let backgroundQueue = DispatchQueue.global(Int(qualityOfServiceClass.rawValue), 0) 
    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 
     //for i in 1...2000 { 
     // self.yourArrayThatIsPopulatingTheTable.append("\(i) hot potatoes") 
     //} 

     DispatchQueue.main.async(execute: {() -> Void in 
      self.myTableView.reloadData() 
      self.refresher.endRefreshing() 
     }) 
    }) 

} 
func refreshData(sender: UIRefreshControl) { 


    refresher.endRefreshing() 
    myTableView.reloadData() 

} 

回答

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

} 
+0

我應該在哪裏把我的新removeLoadingScreen()方法? – user8000557

+0

請參閱編輯答案。 –

+0

我試過了,它仍然不會自行停止,它只會在我下拉刷新表格後停止並消失 – user8000557

0

試試這個:

fileprivate func removeLoadingScreen() {  
    self.spinner.stopAnimating() // use this two lines anywhere you need to hide indicator 
    loadingView.isHidden = true 
} 
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」,「微調器「,」加載標籤「,你不需要」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功能,除非你真的想通過排排動畫的效果,在這種情況下:

  1. 你要麼讓它因爲它是,它不會是相當明顯的(實際上,根本看不到...),但它會減慢你的用戶界面

  2. 或者,如果你想花時間和你想交易特殊效果的響應,你必須設置一個完成處理器 並在上一次完成後爲每一行設置動畫動畫,這是另一個話題。

我希望它能幫助:)

編輯最後的編輯,翻譯成斯威夫特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() 
     }) 
    }) 

} 
+0

你想達到什麼目的?你想以哪種方式定製你的refreshControl?我試圖看看它是不是可以做得更容易。 – SimSim

+0

我希望打開視圖後立即顯示活動指示器,因爲它通常需要很短的時間直到檢索表格視圖數據爲止 – user8000557

+0

哦,我明白了。等一下。 – SimSim

相關問題