2012-02-13 17 views
3

私はUITabBarControllerを使ってタブ付きのアプリケーションを持っています。 2つのタブがあり、それぞれViewController1 & ViewController2にリンクされています。各ビューコントローラがロードされると、サーバからデータがフェッチされます。したがって、私はローディングステータスを表示するのにMBProgressHUDを使用します。iOS MBProgressHUD:正しいタイミングで表示

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

しかし、私がしたいことは: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]; 
} 

UPDATE:ここで私は、サンプルのXcodeプロジェクトを持って、あなたたちはそれを試してみると、私は何を逃した私に言うことができる。ここ

は、私が使用するコードです。 [Download Link]

答えて

4

私はこれまでに同じ問題を抱えていました。 HUDはメインスレッドへのアクセスを必要とします。私の推測では、メインスレッドをブロックしているネストされたメソッドで呼び出すことです。

メインスレッドでワークロードを呼び出すメソッドを呼び出してみてください。これはあなたのHUDを提示し、必要に応じて却下します。

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

-(void)callingMethod { 
    [self performSelectorOnMainThread:@selector(dataLoadMethod) withObject:nil waitUntilDone:NO]; 
} 
+0

もう1つ追加する: 'MBProgressHUD'のデリゲートを構成します。 – Raptor

+1

あなたはすでにそのコードを持っていましたので、私はそれを含めませんでした。ただし、-showWhileExecutingを呼び出す前にHUDを設定する必要があります。お役に立てて嬉しいです。 –

0

私の答えは、同様の問題を参照してくださいhere

MBProgressHUDを使用することについての私の基本的な意見は、ビューのライフサイクルメソッド内でそれとやりとりするのを避け、代わりにHUDだけを制御する専用のメソッドを使用することです。それは、あなたが1行のコードでVCプッシュをアニメーション場合

@interface MyViewController : UIViewController 

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

@end 

UIKitは、なるように、例えば一緒にアニメーションを合成については非常に良いですが、その後すぐにHUDを表示するには、次の原因で:たとえば、 VCが右からスライドし、HUDがその上にポップアップするので、すべてがとても素敵に見えます(これを実現するには、HUDのウィンドウを基にする必要があります)。また、データフェッチの開始時にHUDを表示し、最後にHUDを閉じることができます。私の経験では、データの取り出しは非常に高速になるため、HUDはあまりに早く提示/却下されます。これを補うために、私はちょうどNSTimerを使って、0.5秒後にHUDを却下します(または、何かが正しいと感じるもの)。

要するに、上記のviewDidLoadからHUDコードを削除し、おそらくタブバーのイベントを傍受して他の方法で制御するとします。

これは役に立ちますか?

関連する問題