Индикатор активности при интеграции в панель поиска не отображается в iPhone SDK - PullRequest
6 голосов
/ 11 декабря 2010

В моем приложении для iPhone я хочу добавить индикатор активности поверх панели поиска.

При поиске должен отображаться индикатор активности.

Я добавил индикатор активности в XIBи создал свой выход.

Я скрываю его, когда поиск заканчивается, но индикатор активности не отображается.

Проблема

Я разобралсяэта поисковая функция (скажем, A) (где я анимирую индикатор активности), в свою очередь, вызывает другую функцию (скажем, B), поэтому основной поток используется при выполнении функции B. Но для индикатора активности для анимации мытребуется основной поток.

Поэтому я попытался вызвать функцию B, используя метод performSelectorInBackGround:withObject.Теперь, когда я нажимаю кнопку поиска, отображается индикатор активности, но функциональность функции B. не выполняется.

Что может быть в качестве обходного пути для этого?

Ответы [ 8 ]

1 голос
/ 13 января 2011

Спасите себя от необходимости создавать собственный индикатор активности и использовать стандартный, который уже доступен для вас - в верхней панели. Кроме того, пользователи ИМО, как правило, ожидают, что тот будет крутиться, когда что-то происходит.

UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES; 

Очевидно, установите его на NO, когда ваша деятельность закончится.

1 голос
/ 11 декабря 2010

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

  1. Убедитесь, что действие действительно связано с идентификатором UIActivityIndicator, который вы создаете в IB. (Я бы установил точку останова на setHidden: lines и удостоверился, что переменная не равна нулю. Или бросил NSAssert (активность, @ "К сожалению! Actity is null"); там).

  2. Если переменная действительно установлена, я бы начал проверять, находится ли она в нужном месте в иерархии представлений. (Я бы попробовал сделать [self.view addSubview: activity] и увидел, что он появляется. Возможно, вам придется заменить его где-нибудь еще.)

  3. Возможно, вы захотите включить его по умолчанию в IB, пока у вас все не выяснится.

Удачи. Надеюсь, это поможет.

0 голосов
/ 03 февраля 2011

У меня есть решение, и оно выглядит следующим образом.

Я только что написал следующую строку в событии щелчка кнопки поиска.

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

И определил функцию threadStartAnimating: следующим образом:

-(void)threadStartAnimating:(id)data
{
   [activityIndicator setHidden:NO];
   [activityIndicator startAnimating]; 
}
0 голосов
/ 02 февраля 2011

начать анимацию индикатора активности и с задержкой 0,1 или 0,2 просто вызовите другой метод, который вам нужен .... я пытался, и он работает для меня ....

0 голосов
/ 31 января 2011

Я предлагаю вам использовать DSActivityView для отображения вашего индикатора активности. Исходный код можно найти по адресу Dejal blog .

Отображение и скрытие представления активности представляет собой простую строку кода.

[DSActivityView activityViewForView:self.view];

0 голосов
/ 30 января 2011

Возможно, у вас есть вид перед вашим индикатором активности?Что делать, если вы всегда приносите это на фронт ...

loadView = [[UIActivityIndicatorView alloc] 
            initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
loadView.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
loadView.center = window.center;
loadView.opaque = NO;
[window addSubview: loadView];
[window bringSubviewToFront:loadView];
[loadView startAnimating];
0 голосов
/ 18 декабря 2010

попробуйте это:

установить hidesWhenStopped = NO, чтобы он отображался постоянно, а затем скрывать и показывать его вручнуюНо в IB необходимо сначала скрыть вид.

- (void)startActivityView {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    activity_view.hidden = NO;
    [pool drain];
}

- (void)stopActivityView {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    activity_view.hidden = YES;
    [pool drain];
}

- (void)doSomething {
    [self performSelectorInBackground:@selector(startActivityView) withObject:nil];
    // do some time consuming work
    [self performSelectorInBackground:@selector(stopActivityView) withObject:nil];
}
0 голосов
/ 11 декабря 2010

Прежде всего, убедитесь, что у вас есть активность @synthesize в верхней части вашего файла .m.Затем в методе viewDidLoad введите activity.hidesWhenStopped = TRUE;.Далее, в методе, который вызывается при запуске поиска, введите [activity startAnimating]; и [activity stopAnimating]; в методе, когда поиск остановлен.

...