Domanda

Sto cercando di ottenere una vista occupato visualizzata nel corso di un processo di ricerca però non sembra mai di visualizzazione.

Quello che sto cercando di realizzare

  1. L'utente fa clic sul pulsante di ricerca una volta che sono entrati nel testo in un UISearchBar.
  2. Il testo inserito viene delegata a searchBarSearchButtonClicked.
  3. Mostra una "vista Occupato", che è un'UIView contenente un UIActivityIndicatorView per indicare la ricerca è in corso.
  4. Eseguire una ricerca che comunica con un sito web.
  5. Al termine di ricerca rimuovere il "Occupato View".

Cosa c'è di sbagliato

Il processo di ricerca sta lavorando bene, utilizzando il debugger posso vedere che si muove attraverso la funzione di bene searchBarSearchButtonClicked tuttavia la "Busy View" non compare mai. La ricerca prende 2-3 secondi quindi in teoria dovrei vedere il mio "Occupato View" appaiono per quei 2-3 secondi.


Codice Tentativo 1 - Aggiungi e rimuovere il "Busy View" dal superview **

- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar {

 [activeSearchBar setShowsCancelButton:NO animated:YES];
 [activeSearchBar resignFirstResponder];
 [busyView activateSpinner]; //start the spinner spinning
 [self.view addSubview:busyView]; //show the BusyView

 Search *search = [[Search alloc]init];
 results = [search doSearch:activeSearchBar.text];

 [busyView deactivateSpinner]; //Stop the spinner spinning
 [busyView removeFromSuperview]; //remove the BusyView
 [search release]; search = nil;

}

Risultati di tentato 1 -. non sembra, se io commento la removeFromSuperview chiamare i Busy Vista resti sullo schermo


Codice Tentativo 2 - utilizzando animazioni

- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar {



[activeSearchBar setShowsCancelButton:NO animated:YES]; 
 [activeSearchBar resignFirstResponder];

 [UIView beginAnimations:nil context:nil];
 [UIView setAnimationDuration:0];
 [UIView setAnimationDelegate:self];
 [UIView setAnimationDidStopSelector:@selector(animationDidStop)];

 [busyView activateSpinner]; //start spinning the spinner
 [self.view addSubview:busyView]; //show the busy view

 [UIView commitAnimations];

 Search *search = [[Search alloc]init];
 results = [search doSearch:activeSearchBar.text];


 [UIView beginAnimations:nil context:nil];
 [UIView setAnimationDuration:0];
 [UIView setAnimationDelegate:self];
 [UIView setAnimationDidStopSelector:@selector(animationDidStop)];

 [busyView deactivateSpinner]; //sets stops the spinner spinning
 [busyView removeFromSuperview]; //remove the view

 [UIView commitAnimations];
 [search release]; search = nil;
}

Risultati di tentativo 2 - non ha visto il "Busy View" appaiono

È stato utile?

Soluzione

Bene, ecco la mia soluzione:

  • Crea Singleton classe MyLoadingView. Questa classe dovrebbe contenere metodi statici spettacolo e nascondere.
  • In costruttore MyLoadingView si dovrebbe creare manualmente una vista con sfondo nero semi-trasparente e activityview all'interno di esso. Mettere questo punto di vista in [[UIApplication sharedApplication] keyWindow]. Nasconderlo.
  • [MyLoadingView show] invocazione porta solo oggetto myLoadingView di fronte al suo interno del contenitore: [[[UIApplication sharedApplication] keyWindow] bringSubviewToFront:myLoadingViewSharedInstance];. Inoltre, non dimenticare di iniziare activityview animazione.
  • [MyLoadingView hide] ferma animazione activityview e pelli sharedInstanceView.

Si prega di notare, che è necessario richiamare [MyLoadingView show] in un thread separato.

Altri suggerimenti

interfaccia utente cambia in Cocoa solo abbia effetto la prossima volta che i rendimenti codice di controllo per il ciclo di esecuzione. Fino a quando il vostro compito di ricerca viene eseguito in modo sincrono sul thread principale, bloccherà l'esecuzione, inclusi gli aggiornamenti dell'interfaccia utente.

Si dovrebbe eseguire il compito che richiede tempo in modo asincrono in background. Ci sono una serie di opzioni per questo (NSOperation, performSelectorInBackground:..., Grand Central Dispatch, ...).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top