2012-01-10 41 views
9

我有一個進度條有點麻煩,因爲iOS 5中走了出來。下面的代碼在iOS 5之前工作正常,但在iOS 5中,進度條不再顯示在循環中設置的新進度。setProgress不再更新UIProgressView因爲iOS 5的

的代碼,預計這樣的工作:

  1. 創建進度條(作品)
  2. 在一個新的後臺進程:設定的0.25(作品)的初步進展
  3. 在同後臺進程:更新進度,同時要通環路(在iOS 4的工作)

下面是條初始化代碼:

// create a progress bar 
UIProgressView *progressBar = [[UIProgressView alloc] initWithFrame:CGRectMake(coverSizeX*0.25, coverSizeY - 34.0, coverSizeX*0.5, 9.0)]; 
progressBar.progress = 0.0; 
progressBar.progressViewStyle = UIProgressViewStyleBar; 

和在不同的線程它設置一個起點進展至0.25:

// set an initial progress 
[progressBar setProgress: 0.25]; 

一點後,它被更新以顯示下載進度一個循環內的進展:

// within a for-loop: 
NSNumber *counterPercentage; 
for (pageDownload = 1; pageDownload < pagesToDownload; pageDownload++) { 
    counterPercentage = [[NSNumber alloc] initWithFloat: (float)pageDownload/(float)((float)pagesToDownload)]; 
    [progressBar setProgress: [counterPercentage floatValue]]; 
    [progressBar performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; 
} 

...但屏幕上沒有顯示進度,進度條停留在設定的最初的0.25進度上。

有沒有跟iOS 5版本,可以打破它的任何變化?

回答

18

我見過很多像這樣的,因爲iOS 5中開關的問題,我不知道爲什麼只有在iOS的5個問題,但主要是因爲我不知道爲什麼沒有了之前的一個問題。

在你的代碼從後臺線程調用[progressBar setProgress: [counterPercentage floatValue]];。這是一個UI調用,不應該由後臺線程創建。您也可以致電setNeedsDisplay,因爲UIProgressView知道如何顯示自己,所以不需要更新progressBar。 iOS 5似乎已經使更新UI的要求更爲嚴格,但僅限於什麼是最佳實踐。

要我的眼睛,這看起來像塊完美的使用。使用你的循環可以這樣寫塊:

for (pageDownload = 1; pageDownload < pagesToDownload; pageDownload++) { 
     // Other stuff in background 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     progressBar.progress = ((float)pageDownload/(float)pagesToDownload); 
    }); 
     // Other stuff in backgroud 
} 
+1

謝謝,這工作!也感謝大家的不僅僅是提供一個工作的解決方案:-) – favo 2012-01-10 14:18:36

2

它在iOS 5中工作,並給它的最簡單的方法是在這裏:

.h文件中:

IBOutlet UIProgressView *WhateverYouWantToCallIt; 

。 M檔:

[WhateverYouWantToCallIt setProgress:(float) 0.3]; 

而且,它說0.3,你可以把你喜歡的任何值(在0到1)

+0

@ user1791131它不會在IOS 5的工作主要問題是,他正在從非主線程的線程上的UI變化解釋多一點。任何不是主線程的線程所做的UI更改都不會發布。 – BigSauce 2013-03-17 06:40:19