6

私はこれについてSOを読んで読んだことがありますが、自分の状況に一致するものを見つけることができないようです.

アプリがすぐに Web サービス データを取得するため、ビューが表示されると MBProgressHUD が読み込まれます。私の問題は、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 クラスで設定しますか? とてもイライラ...

助けてくれてありがとう。長い投稿をお詫び申し上げます。そして私の醜いコードのために...

4

3 に答える 3

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.
}
于 2013-02-02T08:07:11.487 に答える
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それに応じて行動する必要があります。

これについてさらに説明が必要な場合はお知らせください:)

于 2012-11-03T22:04:12.350 に答える
0

追加情報を取得するには:

  1. ビューで contentView を作成できます
  2. そして、単に contentView に hud を表示します (self.view または self.navigationController.view ではありません)。

このように、navigationBar のビューは hudView に対して責任を負いません。したがって、navigationController のビューから前のページに戻ることができます。

于 2014-05-04T12:08:20.007 に答える