2015-01-19 2 views
3

У меня проблема расчета прогресса для моего UIProgressView. Мое значение поплавка не влияет на ход. Я попытался установить прогресс вручную, он отлично работает, но если я попытаюсь вычислить его, он не сработает.Как установить прогресс в UIProgressView

Вот мой код:

- (void) initProgressbar { 

    self.progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; 
    [self.progressView setFrame:CGRectMake(0, 0, SCREEN_WIDTH/2, 10)]; 
    self.progressView.center = CGPointMake(SCREEN_WIDTH - 110, SCREEN_HEIGHT - 25); 
    self.progressView.progress = 0.0; 
    [self.view addSubview:self.progressView]; 
} 

nbElementsSync и nbElementsToSync глобальные ИНТ свойства и nbElementsSync увеличивается на петлю перед тем updateProgress метод вызывается.

MyController.h

@interface MyController : UIViewController { 

    NSString *json; 
    int nbElementsToSync; 
    int nbElementsSync; 

} 

@property (nonatomic, strong) UIProgressView *progressView; 

MyController.m

nbElementsSync = 0; // Nb elements synchronized 
nbElementsToSync = [[json valueForKey:@"count"] intValue]; // Nb elements to synchronize 

for (NSString* result in results) { 

    nbElementsSync++; 
    [self updateProgress]; 

} 

А вот мой метод, чтобы настроить прогресс:

- (void) updateProgress { 

    [self.progressView setProgress:((float)nbElementsSync/nbElementsToSync)]; 
    NSLog(@"percent : %f", ((float)nbElementsSync/nbElementsToSync)); 

} 

Результаты моего NSLog :

percent : 0.003937 
percent : 0.007874 
percent : 0.011811 
percent : 0.015748 
percent : 0.019685 
percent : 0.023622 
... 

Есть идеи решить эту проблему? Заранее спасибо.

+0

Вы можете показать код, который вы реализуете ed в вашем цикле и изменяется ли nbElementsToSync со временем? – channi

+0

Хорошо, я обновил – user3405644

+0

, так что вы получаете от этого? Убедитесь, что ваш массив «результатов» подсчитан так же, как и у вашего «nbElementsToSync» – channi

ответ

2

Вы пробовали делать петлю в фоновом режиме, чтобы не блокировать обновления пользовательского интерфейса:

MyController.m

Зов это где вам нужно:

[self performSelectorInBackground:@selector(syncInBackground) withObject:nil]; 

Тогда

- (void)syncInBackground 
{ 
    int nbElementsSync = 0; // Nb elements synchronized 
    int nbElementsToSync = [[json valueForKey:@"count"] intValue]; // Nb elements to synchronize 

    for (NSString* result in results) { 
     nbElementsSync++; 

     float percent = (float)nbElementsSync/nbElementsToSync; 

     [self performSelectorOnMainThread:@selector(updateProgress:) withObject:[NSNumber numberWithFloat:percent] waitUntilDone:NO]; 
    } 
} 

- (void) updateProgress:(NSNumber *)percent { 

    [self.progressView setProgress:percent.floatValue]; 
} 
+0

Нет У меня нет. Моя синхронизация должна быть в основном потоке не в фоновом режиме. Я не понимаю, почему мой прогресс не отображается в UIProgressView, когда я мог NSSC процентов и возвращал значения между 0.0 и 1.0 ... – user3405644

+1

Когда вы запускаете тяжелый процесс в основном потоке (например, циклы), вы блокируете пользовательский интерфейс и он не сможет обновиться. Вы должны сделать свою петлю в фоновом потоке и обновить progressView на главной теме – Niko

+0

OK Niko, но мои циклы выполняются в результате множественного соединения NSURL, поэтому было бы сложно реализовать его как фоновый поток ... – user3405644