ios iphone uiactivityindicatorview

ios - UIActivityIndicatorView deja de animar en UITableViewCell



iphone (2)

Creo que puedo arrojar algo de luz sobre cuándo y cómo los hilanderos dejan de girar en las celdas. UIActivityIndicatorView con mi propia clase sobrecargando las funciones startAnimating y stopAnimating y puse puntos de interrupción en ellas. He hecho una celda simple con solo una rueda giratoria de mi clase. He establecido la propiedad de animación del hilandero en verdadero en IB:

Ahora aquí está lo que pasa. Las primeras dos capturas de pantalla tienen un seguimiento de pila que indica que las dos acciones (detener animaciones e iniciarlas) se suceden una tras otra, en la misma función privada _didMoveFromWindow:toWindow :

Me parece que esto está sucediendo en el flujo de creación de celdas, así que primero se inicializa sin animación y luego se activa la configuración de IB y se inicia la animación. Ahora aquí está la parte interesante, cuando el spinner deja de animar:

Así que parece que el spinner sigue girando cuando la celda se retira de la pantalla y se detiene cuando la celda está preparada para mostrarse nuevamente en la pantalla ( prepareForReuse ) a través de la función privada _removeAllAnimations , que parece iterar recursivamente todas las vistas secundarias. El problema es que, por alguna razón, las funciones privadas de UIKit nunca vuelven a habilitar las animaciones y nunca se llama a startAnimating . En realidad, el problema real es la desactivación de animaciones.

La solución que propongo, y no es perfecta, pero aparentemente es lo que Apple espera de nosotros, es subclasificar el UITableViewCell para celdas que contienen giros y volver a habilitarlos en prepareForReuse:

class SpinnerCell: UITableViewCell { @IBOutlet weak var spinner: UIActivityIndicatorView? override func prepareForReuse() { super.prepareForReuse() if let spinner = self.spinner { spinner.startAnimating() } } }

O en Obj-C:

@interface SpinnerCell @property (weak) IBOutlet UIActivityIndicatorView *spinner; @end @implementation SpinnerCell - (void)prepareForReuse { [super prepareForReuse]; [self.spinner startAnimating]; } @end

Tengo una vista de tabla y en esa vista de tabla tengo un UIActivityIndicator con un botón en cada celda. Ahora, al hacer clic en ese botón, quiero iniciar la animación de ActivityIndicator, es el inicio. Pero el problema es que cuando me desplazo la vista de tabla, deja de animar. Aquí está mi código para 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; }

y el método de selección para mi botón es

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


Deberá mantener el indicador de actividad de la celda que se inició como tableView cuando se desplaza para cargar la nueva celda visible de forma secuencial. Como resultado, su indicador de actividad se detiene.

Utilice una matriz para el estado del indicador de actividad que clasificará el objeto miembro.

NSMutableArray *mutArrActIndStatus; //Intialization mutArrActIndStatus = [NSMutableArray array];

Ahora agregue el objeto igual a la fuente de datos tableView. La nota 1 significa iniciado y 0 significa parada. Así que inicialmente todos están en estado de parada

for(int i=0; i<[yourTableViewArray count]; i++) { [mutArrActIndStatus addObject:@"0"]; }

Ahora usa esto en tu tableView:

- (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; }

A continuación, realice cambios en el método de los botones para reemplazar el indicador de estado de actividad.

-(IBAction)recevierButtonClick:(id)sender{ //for find index here to replace status of activity indicator UIButton *btnSender = (UIButton *)sender; [mutArrActIndStatus replaceObjectAtIndex:btnSender.tag withObject:@"1"]; }