Frage

Ich versuche, eine beschäftigt Ansicht während eines Suchvorgangs angezeigt zu bekommen aber es nie zu Anzeige erscheint.

Was ich versuche,

zu erreichen
  1. Der Nutzer klickt auf Suchtaste, sobald sie den Text in einem UISearchBar eingegeben haben.
  2. Der eingegebene Text zu searchBarSearchButtonClicked delegiert wird.
  3. Zeigen Sie ein „Busy Ansicht“, die eine UIView ist eine UIActivityIndicatorView enthält die Suche, um anzuzeigen, ist im Gange.
  4. Führen Sie eine Suche, die mit einer Website in Verbindung steht.
  5. Auf der Suche Abschluss entfernen Sie den "Busy View".

Was ist falsch

Der Suchprozess funktioniert gut, mit dem Debugger ich sehe es durch die searchBarSearchButtonClicked Funktion fein bewegt erscheint jedoch der „Busy View“ nie. Die Suche dauert 2-3 Sekunden so in der Theorie sollte ich meine „Busy View“ erscheint für die 2-3 Sekunden.

siehe

Code-Versuch 1 - hinzufügen und den "Busy View" aus dem Superview entfernen **

- (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;

}

Ergebnisse Versuch 1 -. Es scheint nicht, aber wenn ich die removeFromSuperview die Busy Blick bleibt auf dem Bildschirm aufrufen kommentieren Sie


Code-Versuch 2 - mit Animationen

- (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;
}

Ergebnisse Versuch 2 - Haben die "Busy View" nicht sehen, erscheinen

War es hilfreich?

Lösung

Nun, hier ist meine Lösung:

  • Erstellen Singletonklasse MyLoadingView. Diese Klasse sollte zeigen und verbergen statische Methoden enthalten.
  • In MyLoadingView Konstruktor sollten Sie manuell eine Ansicht mit halbtransparenten schwarzen Hintergrund und activityview in der es schaffen. Diesen Blick in [[UIApplication sharedApplication] keyWindow]. Ausblenden.
  • [MyLoadingView show] Aufruf bringt nur myLoadingView Objekt nach vorne in seinem Behälter: [[[UIApplication sharedApplication] keyWindow] bringSubviewToFront:myLoadingViewSharedInstance];. Vergessen Sie auch nicht activityview Animation zu starten.
  • [MyLoadingView hide] stoppt activityview Animation und Häuten sharedInstanceView.

Bitte beachten Sie, dass Sie benötigen [MyLoadingView show] in einem separaten Thread aufzurufen.

Andere Tipps

Änderungen an der Benutzeroberfläche in Cocoa nur wirksam das nächste Mal Ihren Code zurück in den Run-Schleife zu steuern. Solange Ihre Suchaufgabe synchron auf dem Haupt-Thread ausgeführt wird, wird es die Ausführung blockieren, einschließlich UI-Updates.

Sie sollten die zeitaufwändige Aufgabe asynchron im Hintergrund auszuführen. Es gibt eine Reihe von Optionen für diese (NSOperation, performSelectorInBackground:..., Grand Central Dispatch, ...).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top