2014-01-29 3 views
0

Этот вопрос задан раньше, но ответы не работают. Я знаю, что (исправьте меня, если я ошибаюсь) основной поток обновляет пользовательский интерфейс, поэтому нам нужно вызвать основной поток в цикле. Я пытаюсь это и прогресс бар только обновления в конце цикла (так идет от 0% до 100%)UIProgressBar не обновляется в цикле

Вот мой код

.h

@interface ViewController : UIViewController <UITextFieldDelegate> { 
IBOutlet UIProgressView *progressBar; 
float progressBarPercentage; 
} 
-(IBAction)button:(id)sender; 

@end 

.m

-(IBAction)button:(id)sender{ 

for (int z=0; z < 9; z++){ 

//do stuff 

float progressBarPercentage = (1.0/9.0 * (z + 1)); 
     [self performSelectorOnMainThread:@selector(makeMyProgressBarMove) withObject:nil waitUntilDone:NO]; 

} 

} 

-(void)makeMyProgressBarMove{ 

    [progressBar setProgress:progressBarPercentage animated:YES]; 
    } 

при работе в режиме отладки, я заметил, когда он попадает в линию [self performSelectorOnMainThread:@selector(makeMyProgressBarMove) withObject:nil waitUntilDone:NO]; он просто перезапускает цикл, не вдаваясь в 1makeMyProgressBarMove: `

Кроме того, часть //do stuff не является коротким, на самом деле требуется 5 секунд для запуска кода при нажатии кнопки, поэтому не так быстро обновляется, что я не вижу его.

Спасибо, и дайте мне знать, если требуется дополнительная информация, я еще новичок

+1

Вы должны «делать вещи» в другом потоке также, в противном случае он будет по-прежнему блокировать ваш основной поток. Обратите внимание, что 'performSelectorOnMainThread' не имеет смысла, если вы уже находитесь в основном потоке. – Taum

+0

Я нахожусь в ViewController.m, это главный поток? – uti0mnia

+0

Является ли progressBarPercentage объявленным внутри IBAction или вне его? – Piyuesh

ответ

0

Вы должны «делать вещи» в другом потоке также, в противном случае он по-прежнему будет блокировать основной поток. Обратите внимание, что performSelectorOnMainThread не имеет смысла, если вы уже находитесь в основном потоке.

Использование libdispatch, потому что это гораздо проще:

-(IBAction)button:(id)sender{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     for (int z=0; z < 9; z++) 
     { 
      //do stuff 

      float progressBarPercentage = (1.0/9.0 * (z + 1)); 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       [progressBar setProgress:progressBarPercentage animated:YES]; 
      }); 
     } 
    }); 
} 
+0

. любой ")" отсутствует? Я получаю ошибки – uti0mnia

+0

Да, извините. Это должно быть исправлено! – Taum

+0

Хорошо, я попробую это – uti0mnia

0

теперь попробуйте это

-(IBAction)button:(id)sender{ 

    for (int z=0; z < 9; z++){ 

    //do stuff 

    float progressBarPercentage = (1.0/9.0 * (z + 1)); 
      [self performSelectorOnMainThread:@selector(makeMyProgressBarMove) withObject:nil waitUntilDone:YES]; 

    } 

    } 

    -(void)makeMyProgressBarMove{ 

     [progressBar setProgress:progressBarPercentage animated:YES]; 
     } 
+0

Я уже пробовал это, он сделал то же самое :( – uti0mnia

+0

Я только что проверил отладчик и перешел к методу 'makeMyProgreeBarMove:', но он все еще не обновляет progressbar – uti0mnia