Индикатор активности не вращается - PullRequest
2 голосов
/ 19 декабря 2010

Я пытаюсь добавить индикатор активности вращения (UIActivityIndicatorView) в мое приложение, когда оно анализирует данные из Интернета. У меня есть IBOutlet (спиннер), подключенный к UIActivityIndicatorView в IB. Сначала я настроил это так:

-

 (void) function {
        self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhite];
 self.spinner.hidesWhenStopped = YES;
 [spinner startAnimating];
 //parse data from internet
 [spinner stopAnimating];}

Но спиннер не будет вращаться. Я читал, что это как-то связано с тем, что все в одной теме. Итак, я попробовал это:

    - (void) newFunction {
        self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhite];
 self.spinner.hidesWhenStopped = YES;
 [spinner startAnimating];
 [NSThread detachNewThreadSelector: @selector(function) toTarget: self withObject: nil];
 [spinner stopAnimating];}

Но все равно не повезло. Есть идеи? Спасибо.

Ответы [ 3 ]

8 голосов
/ 19 декабря 2010

Ваш newFunction: метод должен выглядеть следующим образом:

- (void) newFunction {
   self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
   self.spinner.hidesWhenStopped = YES;
   [NSThread detachNewThreadSelector: @selector(function) toTarget: self withObject: nil];
}

А ваш function метод должен выглядеть следующим образом:

- (void) function {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   [self.spinner performSelectorOnMainThread:@selector(startAnimating) withObject:nil waitUntilDone:NO];

   //...

   [self.spinner performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO];
   [pool drain];
}
0 голосов
/ 01 августа 2013

Просто посмотрите, что // анализ данных из интернета является синхронным или асинхронным.Асинхронный означает, что с этого момента будет запущен отдельный поток, и текущее выполнение функции продолжится без задержки.

Во втором примере вы явно создаете отдельный поток, что означает, что @selector(function)в отдельном потоке, и следующий оператор [spinner stopAnimating] выполняется немедленно.Таким образом, кажется, что спиннер вообще не вращается.

Более того, убедитесь, что вы запускаете и останавливаете индикатор активности только в главном потоке.

0 голосов
/ 01 августа 2013

Вы не должны снова инициализировать индикатор. Пожалуйста, замените ваш код этим.

-(void) function {
    [spinner startAnimating];
    [self performSelector:@selector(newfunction) withObject:nil afterDelay:3.0];
}
- (void) newfunction {
     [spinner stopAnimating];
}

Спасибо.

...