Mam UITableView, który z zewnętrznego kanału RSS.Animacja Spinner podczas ładowania nowej strony
Po wybraniu wiersza używa on elementu navigationController i slajdów z prawej strony, problem polega na tym, że kanał RSS zawiera obrazy, dlatego może zająć kilka sekund, aby załadować i bez wskazania, co się dzieje, można pomylić to dla awarii aplikacji.
Postanowiłem dodać spinner, aby wiedzieć, że ładuje się nowa strona.
Oto mój kod:
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";
}
Istnieją dwa problemy z tym kodem.
- Spinner nie działa do momentu załadowania nowej strony.
- Spinner nie wyłącza się po załadowaniu.
Jeśli ktokolwiek mógłby mi pomóc w tym problemie, byłbym naprawdę wdzięczny.
myślę, że wciąż brakuje kodu gdzie następnie widok wskaźnik aktywności zostaje zatrzymane/usunięte. Ponadto: w jaki sposób ładujesz obrazy? Jeśli używasz metody blokowania (tj. Takiej, która nie działa w wątku tła), cała twoja główna pętla zostanie zablokowana, co oznacza: brak interakcji użytkownika, brak animacji itp. (Co tłumaczyłoby to zachowanie). W takim przypadku należy przełączyć się na ładowanie asynchroniczne. –
@TriPhoenix Skąd wiadomo, czy jest to metoda blokująca, czy nie? dodałem w kodzie na DetailsViewController.m –
Możesz powiedzieć, jak działa funkcja: funkcje blokujące natychmiast zwrócą wartość, w tym przypadku 'initWithContentsOfURL' umieści dane w twoim' NSData' tak, aby funkcja nie mogła wrócić przed zwróceniem tych danych. Żądania asynchroniczne są bardziej złożone w tym sensie, że uruchamiasz żądanie i nie otrzymasz wyniku, ale żądanie wywoła funkcję zwrotną w kodzie po zakończeniu. Istnieje kilka frameworków takich jak ASIHTTPRequest, które ułatwiają to działanie lub możesz użyć NSURLConnection i zrobić to samemu. –