UIActivityIndicatorView останавливает анимацию в UITableViewCell
У меня есть один вид таблицы, и в этом представлении таблицы у меня есть один идентификатор UIActivityIndicator с одной кнопкой в каждой ячейке. Теперь, щелкнув по этой кнопке, я хочу начать анимацию ActivityIndicator, ее запуск. Но проблема в том, что когда я просматриваю табличное представление, он прекращает анимацию. Вот мой код для cellForRowAtIndexPath
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"txDevicesListCellID"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"txDevicesListCellID"];
}
UIButton *buttonutton = (UIButton *)[cell viewWithTag:103];
UIActivityIndicatorView *activityIndicator = (UIActivityIndicatorView *) [cell viewWithTag:104];
button.tag = indexPath.row;
return cell;
}
и метод выбора для моей кнопки
-(IBAction)recevierButtonClick:(id)sender{
UIButton *button = (UIButton *)sender;
NSInteger index = button.tag;
NSIndexPath* indexpath = [NSIndexPath indexPathForRow:serialNumber inSection:0];
UITableViewCell* cell = [self.myTableView cellForRowAtIndexPath:indexpath];
activityIndicator = (UIActivityIndicatorView*)[cell viewWithTag:index];
[activityIndicator startAnimating];
}
Ответы
Ответ 1
Думаю, я смогу пролить свет на то, когда и как прядильщики перестают вращаться в камерах.
Я подклассифицировал UIActivityIndicatorView
, когда мой собственный класс перегрузил функции startAnimating
и stopAnimating
и поставил в них контрольные точки. Я сделал простую ячейку, на которой был только один экземпляр моего класса. Я установил свойство spinner Animating true в IB:
![введите описание изображения здесь]()
Теперь вот что происходит. Первые два скриншота имеют трассировку стека, которая указывает, что два действия (остановка анимации и их запуск) происходят один за другим в той же частной функции _didMoveFromWindow:toWindow
:
![введите описание изображения здесь]()
Мне кажется, что это происходит в потоке создания ячейки, поэтому сначала он инициализируется без анимации, а затем настройки IB запускаются и запускают анимацию. Теперь вот интересная часть, когда заклинатель перестает оживлять:
![введите описание изображения здесь]()
Похоже, что прядильщик продолжает вращаться, когда ячейка удаляется с экрана, и останавливается, когда ячейка готова снова отобразиться на экране (prepareForReuse
) через закрытую функцию _removeAllAnimations
, которая, похоже, рекурсивно повторяется все детские представления.
Проблема в том, что по какой-то причине частные функции UIKit никогда не активируют анимацию, а startAnimating
никогда не вызываются. На самом деле ИМО - отключение анимации - настоящая проблема.
Решение, которое я предлагаю, и оно не идеально, но, по-видимому, это то, что Apple ожидает от нас, подклассифицирует UITableViewCell для ячеек, которые содержат прядильщики и повторно активируют их в prepareForReuse:
class SpinnerCell: UITableViewCell {
@IBOutlet weak var spinner: UIActivityIndicatorView?
override func prepareForReuse() {
super.prepareForReuse()
if let spinner = self.spinner {
spinner.startAnimating()
}
}
}
Или в Obj-C:
@interface SpinnerCell
@property (weak) IBOutlet UIActivityIndicatorView *spinner;
@end
@implementation SpinnerCell
- (void)prepareForReuse {
[super prepareForReuse];
[self.spinner startAnimating];
}
@end
Ответ 2
Вам необходимо будет поддерживать, какой индикатор активности ячейки был запущен как tableView при прокрутке новой видимой ячейки последовательно. В результате ваш индикатор активности будет остановлен.
Используйте один массив для статуса индикатора активности, который будет объектом класса.
NSMutableArray *mutArrActIndStatus;
//Intialization
mutArrActIndStatus = [NSMutableArray array];
Теперь добавьте объект, равный источнику данных tableView. Примечание 1 означает, что началось и 0 означает остановку. Таким образом, все в состоянии остановить состояние
for(int i=0; i<[yourTableViewArray count]; i++)
{
[mutArrActIndStatus addObject:@"0"];
}
Теперь используйте это в таблицеView:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//...............
//................
UIActivityIndicatorView *activityIndicator = (UIActivityIndicatorView *) [cell viewWithTag:104];
button.tag = indexPath.row;
NSString *strActIndStatus = mutArrActIndStatus[indexPath.row];
if([strActIndStatus isEqualToString:@"1"])
{
[activityIndicator startAnimating];
}
return cell;
}
Далее внести изменения в кнопочный метод, чтобы заменить статус индикатора активности
-(IBAction)recevierButtonClick:(id)sender{
//for find index here to replace status of activity indicator
UIButton *btnSender = (UIButton *)sender;
[mutArrActIndStatus replaceObjectAtIndex:btnSender.tag withObject:@"1"];
}