• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Einen "loadingView" richtig einbauen

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Hallo zusammen,
Ich habe einen navigationController mit meinem RootViewController der einen UIButton enthält. Tippt man auf diesen, gelangt man auf einen SecondViewController. Da das einige Sekunden dauern kann (lade in der Zeit nämlich daten von einem Server) wollte ich während dieser Zeit meinen "loadingView" anzeigen lassen. Also hab ich folgendes in die Methode prepareForSegue geschrieben:
Code:
[self.navigationController.view addSubview:backgroundLoadingView];
        [self.navigationController.view bringSubviewToFront:backgroundLoadingView];
Aber wenn ich dann den Button drücke wird der loadingView gar nicht angezeigt. Erst wenn der zweite View erscheint blitzt der loading View für 2 millisekunden kurz auf und verschwindet wieder.
Das der verschwindet liegt daran das ich den Befehl
Code:
[backgroundLoadingView removeFromSuperview];
in der viewDidDisappear vom RootViewController aufrufe aber viewDidDisappear wrd doch erst viel viel später aufgerufen als prepareForSegue.

Normalerweise müsste es so sein:
1.Klick auf den Button
2.LoadingView wird angezeigt
3.Daten werden vom Server geladen
4.RootView verschwindet
5. Loading View verswindet.

aber so wie ich es jetzt habe wird Punkt 2 einfach übersprungen.

Was mache ich falsch?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Normalerweise müsste es so sein:
1.Klick auf den Button
2.LoadingView wird angezeigt
3.Daten werden vom Server geladen
4.RootView verschwindet
5. Loading View verswindet.

aber so wie ich es jetzt habe wird Punkt 2 einfach übersprungen.

Was mache ich falsch?
Du musst bevor Du mit dem Laden der Daten vom Server anfängst, erst einmal wieder in die Runloop zurück kehren, damit das UI die Möglichkeit hat, die Änderungen auch darzustellen. Den Code zum Laden der Daten packst Du in eine separate Methode und rufst diese dann per performSelector:withObject:afterDelay: auf. Als Delay kannst Du durchaus 0 angeben.

MacApple
 

GoodGuy

Granny Smith
Registriert
02.12.12
Beiträge
12
Eine Frage, muss es ein "Loading View" sein? Denn falls du nur dem User mitteilen möchtest, dass etwas geschieht bzw. geladen wird, würde ich dir den UIActivityIndicator oder falls bisschen individueller sein sollte - den MBProgressHUD empfehlen.
Übrigens wenn du die Daten per NSURLConnection lädst, gibt es da eine Methode -> connectionDidFinishLoading. Also könntest du z.B. bereits beim viewDidLoad deinen ActivityIndicator anzeigen und bei connectionDidFinishLoading wieder verbergen.

GoodGuy
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Danke für die Info!
Ich hab mir den MBProgressHUD mal angeschaut und eingebaut und zwar in meine prepareForSegue-Methode.
Leider funktioniert das in keinster Weise.
Das heißt das der HUD nicht angezeigt wird und auch die Methode wird nicht ausgeführt.
Es verhält sich so als hätte ich alles auskommentiert.
ich übergebe über den selector die Methode und bei "withObject" den Parameter den die Methode erwartet.
Das Ganze sieht dann so aus:
Code:
HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
        HUD.labelText = @"Doing funky stuff...";
        HUD.detailsLabelText = @"Just relax";
        HUD.mode = MBProgressHUDModeAnnularDeterminate;
        [self.navigationController.view addSubview:HUD];
        [HUD showWhileExecuting:@selector(prepareJSONData:) onTarget:self withObject:[self getJSONData] animated:YES];
Was mache ich da falsch?
 

GoodGuy

Granny Smith
Registriert
02.12.12
Beiträge
12
Probier mal bei initWithView nur mit - self.view zu initialisieren.
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Das habe ich schon versucht, leider ohne Erfolg. So hatte ich es auch ganz zu beginn und hatte es dann geändert, weil ich festgestellt habe das ich Subviews nur auf dem view des RootViewControllers anzeigen kann. Jetzt ist es so: Ich drücke den Button und dann passiert erstmal gar nix außer das die Daten geladen werden aber es erscheint in der Zeit nicht dieses HUD. Dann ist er fertig mit laden, prepareForSegue wird vollzogen, der HUD erscheint für gefühlte 2 Millisekunden und verschwindet wieder. Das heißt er wird viel zu spät angezeigt. Ich poste her jetzt mal die prepareForSegue-Methode und die zwei Daten Methoden.
Code:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    
    if([segue.identifier isEqualToString:@"showAllPoints"])
    {  
        HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
        HUD.labelText = @"Doing funky stuff...";
        HUD.detailsLabelText = @"Just relax";
        HUD.mode = MBProgressHUDModeAnnularDeterminate;
        [self.navigationController.view addSubview:HUD];
        
        [HUD showWhileExecuting:@selector(prepareJSONData:) onTarget:self withObject:[self getJSONData] animated:YES];
        
      [self prepareJSONData:[self getJSONData]];  
      [segue.destinationViewController setPoints:myArray];
    }

}

-(NSData *)getJSONData
{
    NSURL *url = [NSURL URLWithString:@"http://www.beispiel-url.de/beispiel.php"];
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:url];
    [request setHTTPMethod:@"POST"];
    
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    
    NSError *error;
    NSURLResponse *response;
    
    NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    if(!urlData)
    {
        NSLog(@"Fehler !!!");
        return nil;
    }
    
    return urlData;
}

-(void)prepareJSONData:(NSData *)jsonData
{
    NSError *error;
    
    NSDictionary *wholeDict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
    
    myArray = [wholeDict objectForKey:@"points"];
    
}

Irgendwo muss doch der Fehler liegen. Ich hoffe ihr könnt mir helfen.
 
Zuletzt bearbeitet:

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Du hast das selbe Problem, wie ich Dir hier bereits geschrieben habe. Durch
Code:
[self prepareJSONData:[self getJSONData]];
in Deiner prepareForSegue:sender: Methode kehrst Du weiterhin nicht in die Runloop zurück. Was Du jetzt anders machst ist, dass Du durch
Code:
[HUD showWhileExecuting:@selector(prepareJSONData:) onTarget:self withObject:[self getJSONData] animated:YES];
die Daten jetzt auch noch doppelt holst.

MacApple