Animate Spinner al cargar nueva página

Tengo una UITableView que desde una fuente RSS externa.

Cuando seleccionas una fila utiliza el control de navigation y se desliza por la derecha, el problema es que la fuente RSS contiene imágenes, por lo tanto puede demorar unos segundos en cargarse y sin ninguna indicación de lo que está sucediendo puedes confundirla con una aplicación choque.

Decidí agregar una ruleta para que sepas que la nueva página se está cargando.

Aquí está mi código:

RootViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"Loading New Page"); [tableView deselectRowAtIndexPath:indexPath animated:YES]; DetailsViewController *detailViewController = [[DetailsViewController alloc] initWithNibName:@"DetailsViewController" bundle:nil]; detailViewController.item = [rssItems objectAtIndex:floor(indexPath.row/2)]; [self.navigationController pushViewController:detailViewController animated:YES]; [detailViewController release]; UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; spinner.center = CGPointMake(160, 240); [self.view addSubview:spinner]; [spinner startAnimating]; [spinner release]; } 

DetailsViewController.m

 - (void)viewDidLoad { [super viewDidLoad]; NSString *imgURL = [item objectForKey:@"image"]; NSData *mydata = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imgURL]]; item_photo.image = [[UIImage alloc] initWithData:mydata]; item_title.text = [item objectForKey:@"title"]; item_date.text = [NSString stringWithFormat:@"Date: %@",[item objectForKey:@"date"]]; item_time.text = [NSString stringWithFormat:@"Time: %@",[item objectForKey:@"time"]]; item_cost.text = [NSString stringWithFormat:@"Cost: £%@",[item objectForKey:@"cost"]]; item_info.text = [item objectForKey:@"description"]; self.navigationItem.title = @"Event Type"; } 

Hay dos problemas con este código.

  1. El Spinner no se activa hasta después de que la nueva página se haya cargado.
  2. El Spinner no se deshabilita una vez cargado.

Si alguien pudiera ayudarme con este problema, estaría muy agradecido.

Está agregando la vista de indicador de actividad a la vista del controller que está presionando el controller de vista de detalle, por lo que no lo verá de todos modos

intente mover el segundo grupo de código al método viewDidLoad de DetailsViewController, puede llamar a stopAnimating en el indicador de actividad cuando haya terminado de cargar. Para get una reference al UIActivityIndicator, debe agregar una label

por ejemplo, en viewDidLoad

 UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; spinner.center = CGPointMake(160, 240); spinner.tag = 12; [self.view addSubview:spinner]; [spinner startAnimating]; [spinner release]; 

en el método loadingFinished (cualquiera que sea el método que se llama al finalizar la carga)

 [[self.view viewWithTag:12] stopAnimating]; 

Necesitas hacer un poco de trabajo en un hilo de background. Si la siguiente línea es la que se toma el time:

 detailViewController.item = [rssItems objectAtIndex:floor(indexPath.row/2)]; 

Entonces podrías hacer esto en segundo plano con GCD:

 UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; dispatch_async(dispatch_get_global_queue(0, 0), ^{ // This is the operation that blocks the main thread, so we execute it in a background thread id item = [rssItems objectAtIndex:floor(indexPath.row/2)]; // UIKit calls need to be made on the main thread, so re-dispatch there dispatch_async(dispatch_get_main_queue(), ^{ detailViewController.item = item; [spinner stopAnimating]; }); }); 

Y +1 a @ wattson12 – debe agregar el spinner a la nueva vista en su lugar. Alternativamente, puede agregar el spinner a la vista actual y, en su lugar, colocar la llamada pushViewController en el bloque de la queue principal de GCD.

Punto final: querrás eliminar el spinner de su supervisión una vez que lo detengas animando. Alternativamente, puede tener una sola instancia del spinner y establecer hidesWhenStopped to YES.

Esta es una rueda giratoria sobre una vista borrosa en swift:

 func blurScence(){ let blurEffect: UIBlurEffect = UIBlurEffect(style: .Dark) let blurView: UIVisualEffectView = UIVisualEffectView(effect: blurEffect) blurView.translatesAutoresizingMaskIntoConstraints = false blurView.frame = self.view.frame let spinner = UIActivityIndicatorView(activityIndicatorStyle:.White) spinner.center=blurView.center blurView.addSubview(spinner) spinner.startAnimating() self.view.addSubview(blurView) }