iphone - bar - Cómo configurar un UIActivityIndicatorView al cargar un UITableViewCell
progress view swift 4 (5)
Tengo dos UITableViewController
s, A y B. Cuando UITableViewController
una celda en la tabla A, UINavigationController
para empujar el controlador de vista de tabla B. Pero los datos de B se descargan de Internet, lo que lleva varios segundos. Entonces, quiero agregar UIActivityIndicatorView
al cargar B. ¿Cómo puedo lograr esto?
En viewDidLoad de la clase B de la vista de tabla, agregue un indicador de actividad.
// Create the Activity Indicator.
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
activityIndicator.hidesWhenStopped = true
view.addSubview(activityIndicator)
// Position it at the center of the ViewController.
activityIndicator.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
activityIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor),
activityIndicator.centerYAnchor.constraint(equalTo: view.centerYAnchor)])
activityIndicator.startAnimating()
Ahora llame a su método que descarga datos de la red.
myDownloadMethod()
Hágalo en un hilo diferente si no desea que la UI no responda durante el proceso.
Lee este hilo para eso. ¿Puedo usar un hilo de fondo para analizar datos?
Cuando se le notifica que se descargan los contenidos, detenga el indicador.
activityIndicator.stopAnimating()
Ahora puede llamar a tableview.reloadData()
para volver a cargar la tabla y mostrar los nuevos contenidos.
Este código a continuación mostrará un spinner en el pie de página de la vista de tabla si hay más datos disponibles en el servidor. Puede cambiarlo según su lógica de obtención de datos del servidor.
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
/* set cell attributes here */
NSInteger lastSectionIndex = [tableView numberOfSections] - 1;
NSInteger lastRowIndex = [tableView numberOfRowsInSection:lastSectionIndex] - 1;
if ((indexPath.section == lastSectionIndex) && (indexPath.row == lastRowIndex)) {
if(isMoreDataAvailableOnserver)
{
[self showSpinnerAtFooter];
[self getMoreDataFromServer];
}
else
{
[self hideSpinnerAtFooter];
}
}
return cell;
}
-(void) hideSpinnerAtFooter {
self.tableView.tableFooterView =nil;
}
-(void) showSpinnerAtFooter {
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[spinner startAnimating];
spinner.frame = CGRectMake(0, 0, 320, 44);
self.tableView.tableFooterView = spinner;
}
Me funciona bien, puedes intentarlo:
[activityIndicator startAnimating ] cuando didHighlightRowAtIndexPath , [activityIndicator stopAnimating ] cuando didUnighlightRowAtIndexPath es útil que didSelectRowAtIndexPath.
- (void)runIndicatorAtIndexPath:(NSIndexPath *)indexPath display:(BOOL)playing{
UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
cell.accessoryView = activityIndicator;
playing == YES ?[activityIndicator startAnimating]:[activityIndicator stopAnimating];
}
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
[self runIndicatorAtIndexPath:indexPath display:YES];
}
- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath{
[self runIndicatorAtIndexPath:indexPath display:NO];
}
Puede agregar UIActivityIndicatorView como accessView de la celda.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinner.frame = CGRectMake(0, 0, 24, 24);
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryView = spinner;
[spinner startAnimating];
[spinner release];
}
UIActivityIndicatorView * activityindicator1 = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(150, 200, 30, 30)];
[activityindicator1 setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
[activityindicator1 setColor:[UIColor orangeColor]];
[self.view addSubview:activityindicator1];
[activityindicator1 startAnimating];
[self performSelector:@selector(callfunction) withObject:activityindicator1 afterDelay:1.0];
-(void)callfunction
{
// Here your stuf
}