2012-11-03 4 views
6

私はこのことについて読んで読んでいるので、自分の状況に合ったものを見つけることができないようです。JSON呼び出しに時間がかかり過ぎると、ユーザーにMBProgressHUDをキャンセルさせる

ビューが表示されるときに私はMBProgressHUDを読み込んでいます。私のアプリはすぐにいくつかのWebサービスデータを取得するようになります。私の問題は、HUDが表示されている間(したがってアプリケーションがそのデータを取得している間)ナビゲーションコントローラの「戻る」ボタンが反応しないことです。私は無限の待っている場合は、ユーザーが逃げ出すためにタップすることができます(または最悪の場合は戻るボタンを押すことができます)。ビューが表示されるとすぐに実行されるコードは次のとおりです。

#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 

JSONの構文解析についてすべて抜け出しています。これはすべて正常に動作し、HUDはデータが表示されて表示された後に終了します。どのようにしてこれをすべてタップで停止して(空白の)インターフェースに戻すことができるのでしょうか?ジェスチャーレコグナイザ?私はそれをMBProgressHUDクラスに設定しますか?だから失望した...

何か助けて大変ありがとう。長いポストのために私の謝罪。そして、私の醜いコードのために...

答えて

35

MBProgressHUDを拡張する必要が。単純に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]; 

そして:

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

MBProgressHUDは、現在の進捗状況を示すためのカスタム図面が表示されているだけです。つまり、あなたのアプリケーションのロジックの責任を負いません。あなたが長時間実行している操作をある時点でキャンセルする必要がある場合は、これを自分で実装する必要があります。

最も洗練された解決策は、MBProgressHUDを拡張することです。ボタンの役割を果たすカスタム領域を描画することも、プログラムでボタンを追加することも、全体のビューでタップイベントを待つこともできます。そのボタンまたはビューがタップされると、デリゲートメソッドを呼び出すことができます。

それは次のようになります。

// 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)]; 
    } 
} 

あなたがMBProgressHUDのためのデリゲートとしてあなたのビューコントローラを設定し、それに応じて行動しなければなりません。

は、あなたがこの上でより多くの明確化が必要な場合は、私に教えてくださいません:)

+0

この1つの問題は、親ビューのタッチ – Mangesh

0

余分な情報を持っている:

  1. ますあなたのビューでcontentViewを作成することができ
  2. 、単純には、は、このように

(あなたのself.viewかself.navigationController.viewではない)あなたのnavigationBarのビューは責任を負いませんあなたのcontentViewでHUDを表示しますあなたのhudView。したがって、navigationControllerのビューから前のページに戻ることができます。

関連する問題