Нужна помощь с индикатором активности - PullRequest
0 голосов
/ 23 июля 2010

Я не могу заставить работать индикатор активности.

Вот что у меня есть -

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:YES];
//Create an instance of activity indicator view
UIActivityIndicatorView * activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
//set the initial property
[activityIndicator stopAnimating];
[activityIndicator hidesWhenStopped];
//Create an instance of Bar button item with custome view which is of activity indicator
UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
//Set the bar button the navigation bar
[self navigationItem].rightBarButtonItem = barButton;
//Memory clean up
[activityIndicator release];
[barButton release];
}

Часть кода, которая должна его запустить, а затемзакончилась -

...
    else if ([theSelection isEqualToString: @"Update statistics"])
    {
        [self startTheAnimation];
        [updateStatistics  updateThe2010Statistics];
        [self stopTheAnimation];
    }
...


-(void)startTheAnimation {
    [(UIActivityIndicatorView *)[self navigationItem].rightBarButtonItem.customView startAnimating];
}

-(void)stopTheAnimation {
    [(UIActivityIndicatorView *)[self navigationItem].rightBarButtonItem.customView stopAnimating];
}

Ответы [ 2 ]

0 голосов
/ 23 июля 2010

Скорее всего, вы страдаете от блокировки потока системных событий: выполняете ли вы этот метод, когда вы вызываете [updateStatistics updateThe2010Statistics];, из какого-либо обратного вызова IBAction или любого другого метода, который запускается системой (например, -viewDidLoad, -viewWillAppear или аналогичный)?

В этом случае ваша долгосрочная задача заблокирует поток событий, который, в свою очередь, не сможет обновить ваш индикатор активности.Попробуйте сделать следующее:

...
else if ([theSelection isEqualToString: @"Update statistics"])
{
  [self startTheAnimation];
  [self performSelectorInBackground:@selector(doUpdateStatistics) withObject:nil];
}
...

- (void) doUpdateStatistics {
  [updateStatistics  updateThe2010Statistics];
  [self performSelectorOnMainThread:@selector(stopTheAnimation) withObject:nil waitUntilDone:NO];
}

Это выполнит обновление вашей статистики во втором потоке, чтобы ваш поток событий мог правильно обновить индикатор активности.В конце обновления статистики мы снова вызываем анимацию остановки в главном потоке (т.е. в потоке событий), чтобы остановить индикатор вашей активности.

0 голосов
/ 23 июля 2010

Как минимум измените:

   [activityIndicator hidesWhenStopped];

Кому:

   activityIndicator.hidesWhenStopped = YES;

Или удалите эту строку, так как ДА по умолчанию.

...