2016-03-04 56 views
1

我遇到問題。我有一個UITableView和一個UIProgressView視圖,當我滾動表時,progressview不刷新進度值......只有當滾動完成,進度刷新..滾動表上的ProgressView塊

enter image description here

我有不知道爲什麼會發生這種情況。 我試圖刷新與dispatch_async

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 

//I don't know what i have to put here, maybe the NSTimer?? 

    dispatch_async(dispatch_get_main_queue(), ^(void){ 

     //here i set the value of the progress 
    }); 

}); 

,但沒有改變的進展...

回答

2

你幾乎沒有!

我複製了你的問題並修復了它。

這是它沒有修復,這是我覺得你(注意進度指示器不會更新滾動時)這個問題:

enter image description here

,這是它與修復:

enter image description here

的問題是,滾動也發生在主線程和塊它。要解決這個問題,你只需要對你的定時器進行一些小調整。你初始化你的計時器後,補充一點:

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

下面是一些例子最少的代碼:在UITrackingRunLoopMode發生

-(instancetype)init{ 
    self = [super init]; 
    if (self) { 
     _progressSoFar = 0.0; 
    } 
    return self; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.progressIndicator.progress = 0.0; 
    self.myTimer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(callAfterSomeTime:) userInfo: nil repeats: YES]; 
    [[NSRunLoop currentRunLoop] addTimer:self.myTimer forMode:NSRunLoopCommonModes]; 
    [self.myTimer fire]; 
} 

-(void)callAfterSomeTime:(NSTimer *)timer { 
    if (self.progressSoFar == 1.0) { 
     [self.myTimer invalidate]; 
     return; 
    } 

    // Do anything intensive on a background thread (probably not needed) 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
     // Update the progress on the main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.progressSoFar += 0.01; 
      self.progressIndicator.progress = self.progressSoFar; 
     }); 
    }); 
} 

滾動。您需要確保您的計時器也處於該模式。你不應該需要任何後臺線程的東西,除非你做一些奇特的計算,但我已經包含它以防萬一。只需在global_queue調用中但在主線程調用之前執行任何密集型內容。

+0

YEAH !!非常感謝你!! – Quetool