Tengo un UITableView que proviene de un canal RSS externo.Animate Spinner al cargar la nueva página
Cuando selecciona una fila usa navigationController y se desliza desde la derecha, el problema es que la fuente RSS contiene imágenes, por lo tanto, puede llevar unos segundos cargar y sin ninguna indicación de lo que está pasando puede confundirse para una falla de la aplicación.
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.
- El Spinner no se activa hasta que se carga la nueva página.
- El Spinner no se desactiva una vez cargado.
Si alguien pudiera ayudarme con este problema, estaría realmente agradecido.
Creo que todavía se está perdiendo el código donde a continuación, ver indicador de actividad se detiene/eliminado. Además: ¿cómo estás cargando las imágenes? Si está utilizando un método de bloqueo (es decir, uno que no se ejecuta en un hilo de fondo), todo su ciclo principal estará bloqueado, lo que significa: sin interacción del usuario, sin animación, etc. (lo que explicaría este comportamiento). Si este es el caso, realmente debería cambiar a la carga asíncrona. –
@TriPhoenix ¿Cómo sabes si es un método de bloqueo o no? He agregado el código en DetailsViewController.m –
Puede ver cómo funciona la función: las funciones de bloqueo devolverán el valor de inmediato, en este caso 'initWithContentsOfURL' habrá puesto los datos en su' NSData' para que el funciton no pueda devolverlos antes de haber devuelto esta información Las solicitudes asincrónicas son más complejas en el sentido de que usted inicia la solicitud y no se le devolverá el resultado, sino que la solicitud llamará a una función de devolución de llamada en su código cuando finalice. Hay algunos marcos como ASIHTTPRequest que hacen esto más fácil o puede usar NSURLConnection y hacerlo por su cuenta. –