iPhone UIActivityIndicatorView не запускается и не останавливается - PullRequest
8 голосов
/ 05 декабря 2009

Когда я вызываю startAnimating для UIActivityIndicatorView, он не запускается. Почему это?

[Это вопрос в стиле блога с автоответчиком. Решение ниже работает для меня, но, может быть, есть другие, которые лучше?]

Ответы [ 6 ]

16 голосов
/ 05 декабря 2009

Если вы напишите код, подобный этому:

- (void) doStuff
{
    [activityIndicator startAnimating];
    ...lots of computation...
    [activityIndicator stopAnimating];
}

Вы не предоставляете UI время для фактического запуска и остановки индикатора активности, потому что все ваши вычисления находятся в главном потоке. Одним из решений является вызов startAnimating в отдельном потоке:

- (void) threadStartAnimating:(id)data {
    [activityIndicator startAnimating];
}

- (void)doStuff
{ 
    [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];
    ...lots of computation...
    [activityIndicator stopAnimating];
}

Или вы можете поместить свои вычисления в отдельный поток и дождаться его завершения, прежде чем вызывать stopAnimation.

12 голосов
/ 24 декабря 2009

Я обычно делаю:

[activityIndicator startAnimating];
[self performSelector:@selector(lotsOfComputation) withObject:nil afterDelay:0.01];

...

- (void)lotsOfComputation {
    ...
    [activityIndicator stopAnimating];
}
1 голос
/ 02 октября 2016

При необходимости версия swift 3:

func doSomething() {
    activityIndicator.startAnimating()
    DispatchQueue.global(qos: .background).async {
        //do some processing intensive stuff
        DispatchQueue.main.async {
            self.activityIndicator.stopAnimating()
        }
    }
}
1 голос
/ 24 августа 2013

Все элементы интерфейса должны быть в основном потоке

[self performSelectorOnMainThread:@selector(startIndicator) withObject:nil waitUntilDone:NO];

тогда:

-(void)startIndicator{
    [activityIndicator startAnimating];
}
0 голосов
/ 19 декабря 2012

Этот вопрос довольно полезен. Но в ответном сообщении отсутствует одна вещь: все, что занимает много времени, должно выполняться в отдельном потоке, а не в UIActivityIndicatorView. Таким образом, он не перестанет отвечать на интерфейс интерфейса.

    - (void) doLotsOFWork:(id)data {
    //  do the work here.
}

    -(void)doStuff{
    [activityIndicator startAnimating]; 
    [NSThread detachNewThreadSelector:@selector(doLotsOFWork:) toTarget:self withObject:nil]; 
    [activityIndicator stopAnimating];
}
0 голосов
/ 25 декабря 2009

Ладно, извините, похоже, что мой код был слепым.

Я закончил индикатор так:

    [activityIndicator removeFromSuperview];
activityIndicator = nil;

Таким образом, после одного запуска ActivityIndicator был полностью удален.

...