3

を使用したタブ付きアプリがありUITabBarControllerます。ViewController12 つのタブがあり、それぞれ&にリンクされてViewController2います。各View Controllerがロードされると、サーバーからデータがフェッチされます。したがってMBProgressHUD、読み込み状況を表示するために使用します。

ただし、現在の動作は次のように動作します。タブを切り替えると、アプリがハングしたように見えます。しかし、データがサーバーからロードされた後、MBProgressHUD一瞬点滅して消え、ビューが新しいタブに変更されます。

しかし、私が欲しいのはMBProgressHUD、新しいタブが一度タッチMBProgressHUDされたときに表示され、データの読み込みが完了すると閉じられることです。私は何を取りこぼしたか?

私が使用するコードは次のとおりです。

- (void)viewDidLoad
{
    [super viewDidLoad];
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.labelText = NSLocalizedString(@"Loading", nil);
    // load data from server, parsing XML, etc
    [MBProgressHUD hideHUDForView:self.view animated:YES];
}

更新: ここに xCode プロジェクトのサンプルがあります。[ダウンロードリンク]

4

2 に答える 2

4

以前にも同じ問題がありました。HUD が表示されるようにするには、メイン スレッドにアクセスする必要があります。メインスレッドをブロックしているネストされたメソッドで呼び出していると思います。

メインスレッドでワークロードを呼び出すメソッドを呼び出してみてください。これにより、HUD が表示され、必要に応じて閉じられます。

[HUD showWhileExecuting:@selector(callingMethod) onTarget:self withObject:nil animated:YES];

-(void)callingMethod {
   [self performSelectorOnMainThread:@selector(dataLoadMethod) withObject:nil waitUntilDone:NO];
}
于 2012-02-24T17:51:18.187 に答える
0

ここで同様の問題に対する私の回答を参照してください。

使用に関する私の基本的な意見MBProgressHUDは、ビューのライフサイクル メソッド内での操作を避け、代わりに HUD のみを制御する専用のメソッドを使用することです。例えば:

@interface MyViewController : UIViewController

-(void)presentHUDWithText:(NSString *)text;
-(void)dismissHUDWithDelay:(NSTimeInterval)delay; // type name correct? I forget

@end

UIKitはアニメーションを一緒に合成するのに非常に優れているため、たとえば、コードの 1 行で VC プッシュをアニメーション化し、すぐに次の HUD を表示させると、VC がその上に HUD がポップアップします (これを実現するには、ウィンドウ内に HUD を配置する必要がある場合があります)。また、データ フェッチの開始時に HUD を表示し、最後にそれを閉じることができます。私の経験では、データのフェッチが非常に高速になる可能性があるため、HUD の表示/非表示が速すぎます。それを補うためにNSTimer、0.5 秒後 (または適切と思われるもの) を使用して HUD を閉じます。

viewDidLoad要するに、上記の HUD コードを削除し、別の方法 (おそらくタブ バー イベントをインターセプトするなど) で制御するように言っているのです。

これは役に立ちますか?

于 2012-02-24T17:29:14.627 に答える