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"];
}