UIBarButtonItem после анимации исчезает - PullRequest
1 голос
/ 02 марта 2012

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

    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 будет запущена и после обработки кнопка исчезнет. Однако, Я хочу , чтобы исходная кнопка снова отображалась.

Ответы [ 3 ]

0 голосов
/ 03 марта 2012

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

0 голосов
/ 03 марта 2012

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

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

- (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];
}
0 голосов
/ 02 марта 2012

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

...