Заменить UIBARBUTTONITEM с помощью UiActivityIndicatorView не работает
-
28-09-2019 - |
Вопрос
Я хочу заменить кнопку обновления с индикатором активности, когда пользователь нажимает кнопку «Обновить», и после обновления TABLEVIVE я хочу изменить его обратно, чтобы обновить кнопку. Но когда я нажимаю кнопку обновления, она не изменилась на индикатор активности, но кнопка обновления выделена до тех пор, пока передача данных не закончится.
Код как ниже. Я что-то пропустил?
-(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]; }
Решение
Вместо написания
[self reloadNewsEnded];
Пожалуйста, напишите
[NSThread detachNewThreadSelector:@selector(reloadNewsEnded) toTarget:self withObject:nil];
Эта линия начнет новую нить в фоновом режиме, поэтому индикатор активности и перезагрузка данных будет выполняться одновременно в двух потоке.
Другие советы
Почему эта линия в конце reloadNewStarted
метод
[self reloadNewsEnded];
Похоже, просто отмените изменения на кнопке? Вы должны ждать, пока действие не будет завершено, прежде чем звонить
Изменение кнопки не будет вступить в силу до тех пор, пока цикл выполнения не рекомендуется контроль от вашего кода. Похоже, ваша операция перезагрузки синхронно и блокирует очередь событий, что не позволит так, чтобы произойти. Если ваша обработка принимает заметное количество времени, вам необходимо использовать фоновую нитью или асинхронную обработку на главной петле запуска (например, с помощью NSURLConnection для управления сетевой задачей и обратными вызовами), так что вы не блокируете.