1

У меня есть UIBarButtonItem (конфигурируется в построителе интерфейса). Если пользователь нажмет эту кнопку, начнется «тяжелый процесс» и для лучшего удобства пользователя я хочу изменить эту кнопку с помощью (UIActivityIndicatorView). Я делаю это следующим образом:UIBarButtonItem после анимации исчезает

self.indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
    indicator.hidesWhenStopped = YES; 
    [self.heavyBarButton initWithCustomView:self.indicator]; 

    [self.indicator startAnimating]; 

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

animateHeavyProcess:

 [self heavyProcess]; 
    [self.indicator stopAnimating]; 
    UIBarButtonItem *originalButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"maximize.png"] style:UIBarButtonItemStylePlain target:self action:@selector(startProcessClick:)]; 
    self.heavyBarButton = originalButton; 
    [originalButton release]; 

Что происходит после того, как пользователь нажимает анимация BarButton будет запущена и после обработки кнопка исчезает. Однако, Я хочу, что исходная кнопка будет показана снова.

+0

Где вы получаете вопрос? Какова ваша проблема? Ваш вопрос непонятен. –

ответ

0

что делать, если вы используете Grand Central Dispatch для тяжелого процесса? Я бы подумал, что это более удобно. Но помните, что вы не можете использовать какой-либо пользовательский интерфейс в этом блоке. Вот пример: iphone ios running in separate thread

-1

Вы должны использовать UIToolbar's setItems: анимированные: метод для замены кнопок.

0

Вы не должны делать обновления пользовательского интерфейса во вторичном потоке; вызовы UIKit должны быть в основном потоке.

Вы можете разделить вне обновления UI часть вашего кода:

- (void)restoreBarButtonItem 
{ 
    [self.indicator stopAnimating]; 
    UIBarButtonItem *originalButton = [[UIBarButtonItem alloc] 
    initWithImage:[UIImage imageNamed:@"maximize.png"] 
    style:UIBarButtonItemStylePlain 
    target:self 
    action:@selector(startProcessClick:)]; 
    self.heavyBarButton = originalButton; 
    [originalButton release]; 
} 

И тогда в вашем тяжелом процессе (работает на вторичном потоке) просто назвать этот новый метод обновления пользовательского интерфейса на главной теме:

- (void)animateHeavyProcess 
{ 
    [self heavyProcess]; 
    [self performSelectorOnMainThread:@selector(restoreBarButtonItem:) 
    withObject:nil 
    waitUntilDone:NO]; 
} 
Смежные вопросы