Ho un UITableView che da un feed RSS esterno.Animate Spinner quando si carica una nuova pagina
Quando si seleziona una riga utilizza navigationController e scorre da destra, il problema è che il feed RSS contiene immagini quindi può richiedere alcuni secondi per caricare e senza alcuna indicazione di ciò che sta accadendo si può sbagliare per un crash dell'applicazione.
Ho deciso di aggiungere uno spinner per sapere che la nuova pagina è in fase di caricamento.
Ecco il mio codice:
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";
}
Ci sono due problemi con questo codice.
- Lo Spinner non è attivo fino a dopo il caricamento della nuova pagina.
- Lo Spinner non si disabilita una volta caricato.
Se qualcuno potesse aiutarmi con questo problema, sarei davvero grato.
penso che stai ancora manca il codice dove poi indicatore di attività di vista viene arrestato/rimosso. Inoltre: come stai caricando le immagini? Se si utilizza un metodo di blocco (ad esempio uno che non viene eseguito in un thread in background), verrà bloccato l'intero ciclo principale che significa: nessuna interazione dell'utente, nessuna animazione ecc (che spiegherebbe questo comportamento). Se questo è il caso, dovresti davvero passare al caricamento asincrono. –
@TriPhoenix Come fai a sapere se si tratta di un metodo di blocco o no? ho aggiunto nel codice su DetailsViewController.m –
Puoi dire come funziona la funzione: le funzioni di blocco restituiscono immediatamente il valore, in questo caso 'initWithContentsOfURL' avrà messo i dati nel tuo' NSData'so la funzione non può restituire prima di aver restituito questi dati. Le richieste asincrone sono più complesse nel senso che si avvia la richiesta e non si avrà il risultato restituito, ma la richiesta richiamerà una funzione di callback sul proprio codice al termine. Ci sono alcuni framework come ASIHTTPRequest che rendono questo più facile o puoi usare NSURLConnection e farlo da solo. –