2012-01-24 12 views
11

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.

  1. Spinner nie działa do momentu załadowania nowej strony.
  2. 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.

+0

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. –

+0

@TriPhoenix Skąd wiadomo, czy jest to metoda blokująca, czy nie? dodałem w kodzie na DetailsViewController.m –

+0

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. –

Odpowiedz

23

możliwość dodawania pogląd wskaźnik aktywności do widoku kontrolera, który pcha kontroler widok szczegółów, więc nie będziecie zobaczyć to i tak

spróbuj przenieść drugą grupę kodu metody viewDidLoad z DetailsViewController, ty można wywołać stopAnimating na wskaźniku aktywności po zakończeniu ładowania. Aby uzyskać odwołanie do narzędzia UIActivityIndicator, należy dodać znacznik

np. w viewDidLoad

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

w metodzie loadingFinished (jakakolwiek metoda jest wywoływana po zakończeniu ładowania)

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

To nie działa, ponieważ program DetailViewController nie "wyświetla się", dopóki wszystkie informacje nie zostaną załadowane. –

+0

Widok szczegółów nie jest wyświetlany, ponieważ ładujesz dane synchronicznie, co blokuje wątek. musisz wykonać to żądanie w tle, jeśli chcesz pokazać wskaźnik aktywności animacji – wattson12

+0

i jak byś to zrobił? –

3

Musisz popracować w wątku tła. Jeśli następujący wiersz to taki, który ma czas:

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

Następnie można to zrobić w tle z 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]; 
     }); 
}); 

And +1 do @ wattson12 - trzeba dodać spinner do nowego widoku. Alternatywnie możesz dodać spinner do bieżącego widoku, a zamiast tego umieścić wywołanie pushViewController w głównym bloku kolejki GCD.

Punkt końcowy - będziesz chciał usunąć spinner z jego widoku, gdy przestaniesz go animować. Alternatywnie możesz mieć jedną instancję spinnera i ustawić hidesWhenStopped na YES.

0

Jest to kołowrotek na niewyraźne widzenia w 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) 
} 
Powiązane problemy