3

3 番目のタブとして UIView-Subclass (ImageViewer) をネストする UITabBarController があります。

この ImageViewer サブクラスでは、次のviewDidAppearメソッドを呼び出します。

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    /* ... start custom code ... 
    NSLog(@"viewDidAppear tag 1 passed);          /* BREAKPOINT 1 here

    [myUIActivityIndicator stopAnimating];

    NSLog(@"viewDidAppear tag 2 passed);          /* BREAKPOINT 2 here
    /* ... end custom code ... 
}

メソッドは自動的に呼び出されますが、奇妙なことに、このメソッドが完全に処理された後にのみビューが表示されますか?

示されているようにブレークポイント (1 と 2) を設定すると、前のタブがまだ表示されている間に (タブを選択すると) 処理が停止します。2 番目のブレークポイントの後で [続行] をクリックした場合にのみ、ビューが表示されます。(参考までに、NSLogs はすぐに実行されます)。

この場合は、より....viewDidAppearのように動作します。viewWillAppear

何が起こっているのか手がかりはありますか?

乾杯

4

2 に答える 2

10

ビューの読み込み時に画面を再描画できるようにしたいが、 で他の更新コードをトリガーしたい場合は、次のよう-viewDidAppear:に使用します。performSelector:withObject:afterDelay:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self performSelector:@selector(updateUI) withObject:nil afterDelay:0.0];
}

…

- (void)updateUI
{
    // Do your UI stuff here
}

このようにすると、現在のイベント ループがすぐに終了し、UIKit はビューが読み込まれた後に画面を再描画できるようになります。次のイベントループupdateUIで呼び出されます。これは、ビューがロードされた後に計算量の多い計算や更新を実行する必要がある場合に、ビューをすばやく遷移させるのに適した方法です。

于 2010-11-29T08:46:34.580 に答える
0

その音から、メソッドをアクティブに呼び出している場合、viewDidAppear メソッドで「カスタムコード」を実行している間、デバイスは実際にビューを表示する時間がない可能性があります。その場合、プログラムに viewDidAppear メソッド自体を呼び出させる必要があります。

あなたのプログラムは、ビューの表示を遅くする他のコードを処理している可能性もあります。これは、タイマーを使用して解決できます。つまり、次の代わりに:

[self otherCode];

あなたは書くでしょう:

[NSTimer scheduledTimerWithTimeInterval:.5 
    target:self 
    selector:@selector(otherCode) 
    userInfo:nil 
    repeats:NO];

このように、タイマーを使用して「カスタム コード」を単純に遅らせることをお勧めします。

于 2010-11-28T19:06:24.667 に答える