Заменить UIBarButtonItem на UIActivityIndicatorView не работает - PullRequest
1 голос
/ 06 октября 2010

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

код, как показано ниже. Я что-то пропустил?

-(void) reloadNewsStarted{        
UIActivityIndicatorView *activityIndicatorRightBarItem = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[activityIndicatorRightBarItem startAnimating];
UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicatorRightBarItem];
[activityIndicatorRightBarItem release];
self.navigationItem.rightBarButtonItem = activityItem;
[activityItem release];

[self reloadNewsEnded];
}

-(void) reloadNewsEnded {

//reload data process

UIBarButtonItem *reloadNewsBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reloadNewsStarted)];
reloadNewsBtn.style = UIBarButtonItemStyleBordered;
self.navigationItem.rightBarButtonItem = reloadNewsBtn;
[reloadNewsBtn release];  }

Ответы [ 3 ]

2 голосов
/ 07 октября 2010

Вместо записи

[self reloadNewsEnded];

Пожалуйста, напишите

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

в этой строке начинайте новый поток в фоновом режиме, поэтому индикатор активности и перезагрузка данных будут выполняться одновременно в двух потоках.

0 голосов
/ 06 октября 2010

Изменение кнопки не вступит в силу, пока цикл выполнения не восстановит управление из вашего кода. Похоже, что ваша операция перезагрузки является синхронной и блокирует очередь событий, что не позволит этому произойти. Если ваша обработка занимает заметное количество времени, вам нужно использовать либо фоновый поток, либо асинхронную обработку в главном цикле выполнения (например, используя NSURLConnection для управления сетевой задачей и обратными вызовами), чтобы не блокировать.

0 голосов
/ 06 октября 2010

почему эта строка в конце метода reloadNewStarted

[self reloadNewsEnded];

кажется просто отменяет изменения кнопки?Вам следует подождать, пока действие не будет завершено, прежде чем вызывать его

...