2012-11-03 7 views
6

Czytałem i czytałem na ten temat SO, a ja po prostu nie mogę znaleźć niczego, co pasuje do mojej sytuacji.Zezwalaj użytkownikowi na anulowanie MBProgressHUD, gdy wywołanie JSON trwa zbyt długo

Mam MBProgressHUD ładowanie, gdy pojawia się widok, jak moja aplikacja od razu idzie pobrać niektóre dane usługi. Mój problem polega na tym, że przycisk wstecz na moim nawigatorze nie odpowiada, gdy wyświetlany jest HUD (a zatem, gdy aplikacja pobiera swoje dane). Chcę, aby użytkownik był w stanie dotknąć, aby odrzucić (lub aby móc nacisnąć przycisk powrotu w najgorszym przypadku), aby uzyskać do cholery, jeśli to niekończące się oczekiwanie. Oto mój kod, który działa, gdy tylko pojawi się widok:

#ifdef __BLOCKS__ 
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; 
hud.labelText = @"Loading"; 
hud.dimBackground = NO; 
hud.userInteractionEnabled = YES; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    // Do a task in the background 
    NSString *strURL = @"http://WEBSERVICE_URL_HERE"; 

    //All the usual stuff to get the data from the service in here 

    NSDictionary* responseDict = [json objectForKey:@"data"]; // Get the dictionary 
    NSArray* resultsArray = [responseDict objectForKey:@"key"]; 


    // Hide the HUD in the main tread 
    dispatch_async(dispatch_get_main_queue(), ^{ 

     for (NSDictionary* internalDict in resultsArray) 
     { 
      for (NSString *key in [internalDict allKeys]) 
      {//Parse everything and display the results 
      } 

     } 

     [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES]; 
    }); 
}); 
#endif 

Zostawiając cały bełkot o analizie JSON. To wszystko działa dobrze, a HUD odrzuca po wyświetleniu danych i zostanie wyświetlony. Jak w świecie mogę włączyć sposób, aby zatrzymać to wszystko po dotknięciu i wrócić do (pustego) interfejsu? GestureRecognizer? Czy ustawić to w klasie MBProgressHUD? Tak sfrustrowany ...

Najszczersze dzięki za pomoc. Przepraszam za długi post. I dla mojego brzydkiego kodu ...

Odpowiedz

35

ma potrzeby rozszerzania MBProgressHUD. Po prostu dodaj do niego UITapGestureRecognizer.

viewDidLoad :

MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.view animated:NO]; 
HUD.mode = MBProgressHUDModeAnnularDeterminate; 

UITapGestureRecognizer *HUDSingleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(singleTap:)]; 
[HUD addGestureRecognizer:HUDSingleTap]; 

A potem:

-(void)singleTap:(UITapGestureRecognizer*)sender 
{ 
     //do what you need. 
} 
5

MBProgressHUD to tylko widok z niestandardowym rysunkiem wskazującym bieżący postęp, co oznacza, że ​​nie ponosi odpowiedzialności za logikę aplikacji. Jeśli masz długą operację, która musi zostać w pewnym momencie anulowana, musisz ją zaimplementować samodzielnie.

Najbardziej eleganckim rozwiązaniem jest rozszerzenie modelu MBProgressHUD. Możesz narysować obszar niestandardowy, który pełni rolę przycisku, programowo dodać przycisk lub po prostu poczekać na wydarzenie dotknięcia w całym widoku. Następnie możesz wywołać metodę delegata za każdym naciśnięciem tego przycisku lub widoku.

To może wyglądać następująco:

// MBProgressHUD.h 
@protocol MBProgressHUDDelegate <NSObject> 
- (void)hudViewWasTapped; // or any other name 
@end 

// MBProgressHUD.m 
// Either this, or some selector you set up for a gesture recognizer 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    if ([self.delegate respondsToSelector:@selector(hudViewWasTapped)]) { 
     [self.delegate performSelector:@selector(hudViewWasTapped)]; 
    } 
} 

trzeba ustawić kontroler widoku jako delegata na MBProgressHUD i podjąć odpowiednie działania.

Daj mi znać, jeśli potrzebujesz więcej wyjaśnień w tej sprawie :)

+0

Jeden problem z tym, to również zadzwoń, jeśli nadrzędny widok dotykowy – Mangesh

0

mieć dodatkowe informacje:

  1. Ty może stworzyć contentView w widoku
  2. I po prostu pokazać HUD w contentView (nie w self.view lub self.navigationController.view)

w ten sposób twój widok navigationBar nie będzie odpowiedzialny za twój hudView. Możesz więc wrócić z widoku nawigacyjnego kontrolera do poprzedniej strony.

Powiązane problemy