2012-01-10 12 views
9

Mam mały problem z paskiem postępu, ponieważ wyszedł iOS 5. Poniższy kod działał poprawnie przed iOS 5, ale w systemie iOS 5 pasek postępu nie wyświetla już nowego postępu ustawionego w pętli.setProgress nie aktualizuje już UIProgressView, ponieważ iOS 5

Oczekuje się, że kod działa tak:

  1. Tworzenie paska postępu (działa)
  2. w nowy proces w tle: Ustaw początkowy postęp 0,25 (robót)
  3. w tym samym proces w tle: Aktualizacja postępu jadąc thru pętli (pracował w iOS 4)

Oto kod do baru w init:

// 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; 

w innym gwintem ustawia punkt wyjścia dla rozwoju do 0,25:

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

nieco później aktualizuje postęp w pętli do wyświetlania przebiegu pobierania:

// 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]; 
} 

... ale postęp nie jest wyświetlany na ekranie, pasek postępu utknął przy początkowym ustawieniu 0.25.

Czy zostały wprowadzone jakieś zmiany w wydaniu systemu iOS 5, które mogły zostać uszkodzone?

Odpowiedz

18

Od czasu przełącznika iOS 5 widziałem wiele takich pytań, i nie jestem pewien, dlaczego problem występuje tylko w iOS 5. Ale głównie dlatego, że nie jestem pewien, dlaczego nie było problem wcześniej.

W swoim kodzie wywołujesz [progressBar setProgress: [counterPercentage floatValue]]; z wątku tła. Jest to wywołanie interfejsu użytkownika i nie powinno być wykonane z wątku tła. Dzwonisz również pod numer setNeedsDisplay, który nie jest konieczny, aby zaktualizować progressBar, ponieważ UIProgressView wie, jak się wyświetlać. Wydaje się, że iOS 5 wprowadził wymagania dotyczące aktualizacji interfejsu, ale tylko do tego, co jest najlepszym rozwiązaniem.

Moim zdaniem wygląda to idealnie na bloki. Używanie bloków swój pętli można zapisać w ten sposób:

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

Dziękujemy, zadziałało! Dziękuję również za wyjaśnienie czegoś więcej niż tylko dostarczenie działającego rozwiązania :-) – favo

2

To nie działa w iOS 5 i najłatwiejszym sposobem na to jest tutaj:

plik .h:

IBOutlet UIProgressView *WhateverYouWantToCallIt; 

. m file:

[WhateverYouWantToCallIt setProgress:(float) 0.3]; 

A gdzie jest napisane 0,3, można umieścić cokolwiek chcesz wartość (w promieniu 0 do 1)

+0

@ user1791131 to nie działa w systemie iOS 5. Głównym problemem jest to, że zmieniał interfejs użytkownika z wątku innego niż główny wątek. Wszelkie zmiany w interfejsie utworzone z dowolnego wątku, który nie jest głównym wątkiem, nie będą publikowane. – BigSauce