2011-01-15 5 views
0

У меня был UIActivityIndicatorView, работающий отлично в симуляторе и других устройствах 3.0 в моем приложении. Но я узнал, что он не вращался (или не показывался) в новом iphone 4. В принципе, мне нужно показать индикатор активности, когда нажимается кнопка, и скрыть ее, когда событие нажатия кнопки завершено. Я использовал подход ниже.Еще один вопрос о показе UIActivityIndicator

[NSThread detachNewThreadSelector: @selector(spinBegin) toTarget:self withObject:nil];

из этого link. Как уже упоминалось, он правильно вращает индикатор активности на всех, кроме 4. * .. не уверен, почему. Чтобы обойти эту проблему, я последовал другой подход что-то вроде (от developer.apple.com)

` (IBAction) syncOnThreadAction: (идентификатор) отправитель

{

[self willStartJob]; 



[self performSelectorInBackground: 

    @selector(inThreadStartDoJob:) 

    withObject:theJobToDo 

]; 

}

(пустоты) inThreadStartDoJob: (ID) theJobToDo

{

NSAutoreleasePool * pool; 

NSString *   status; 



pool = [[NSAutoreleasePool alloc] init]; 

assert(pool != nil); 



status = [... do long running job specified by theJobToDo ...] 

[self performSelectorOnMainThread: 

    @selector(didStopJobWithStatus:) 

    withObject:status 

    waitUntilDone:NO 

]; 



[pool drain]; 

}

`

Проблема с этим было то, что он показывает acitivityVIewIndicator спиннинг правильно (по крайней мере, на тренажере), но после того, как он останавливается, встроенный индикатор активности в верхней панели (где он показывает батарею% и т. д.) все еще вращается.

Я новичок в объекте C. Я полностью закончил свое приложение, но для этой глупой вещи. Я понимаю, что нет возможности отображать UIActivityView без запуска другого потока. и, наконец, просто для того, чтобы говорить, я не понимаю, почему они должны сделать это настолько сложным. Я имею в виду, они знали, что это будет иметь эту проблему, почему бы не предоставить образец кода, который каждый может использовать, а не выводить свои собственные решения.

И, наконец, кто-нибудь может предоставить мне направление или образец кода. Я был бы очень признателен. Я искал несколько часов и не нашел ничего действительно работающего!

ответ

4

Почему вы запускаете/останавливаете индикатор на отдельной резьбе? Любые методы, которые вы отправляете на ваш UIActivityIndicatorView , должны быть отправлены по основному (UI) потоку.

Любые события, отправленные нажатой кнопкой, будут автоматически запускаться в основном потоке. Если вы используете фоновые потоки для завершения процесса, вы могли бы сделать что-то вроде:

- (IBAction)buttonPressed:(id)sender { 
    // This runs on the main thread 
    [activityIndicator startAnimating]; 
    [self performSelectorInBackground:@selector(inThreadStartDoJob:) withObject:theJobToDo]; 
} 

- (void)inThreadStartDoJob:(id)theJobToDo { 
    // Set up autorelease pool 
    ... 
    // Run your long-running action 
    ... 
    // Stop the spinner. Since we're in a background thread, 
    // we need to push this to the UI Thread 
    [activityIndicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES]; 
} 

Edit: Что касается показателя активности в верхней строке (где батарея), не делает это автоматически начать/остановить на основе сетевой активности?

+0

Последняя строка кода, которую вы упомянули, [activityIndicator performSelectorOnMainThread: @selector (stopAnimating) withObject: nil waitUntilDone: YES]; Вы имели в виду [SELF performSelectorOnMainThread: @selector (stopAnimating) withObject: nil waitUntilDone: YES]; если это так, это именно то, что я делаю, и, похоже, работает, за исключением индикатора активности в верхнем баре.Я не знал, что он основан на сетевой активности, позвольте мне взглянуть. –

+0

Я приму этот ответ. Я закончил работу с [UIApplication sharedApplication] .networkActivityIndicatorVisible = NO; , чтобы не показывать индикатор сети. У меня есть сетевая активность, но все они завершены к моменту вызова метода stop. Не совсем уверен, что там происходит. –

Смежные вопросы