0

ViewControllerでこの関数を実行しているiphone3gがあります

- (void)viewDidAppear:(BOOL)animated {

[super viewDidLoad];

}

TabBar iphone アプリを使用しています。しかし、タブ 1 からタブ 2 をクリックして secondView Controller をデバッグすると、ビューが実際にユーザー ビューに表示される前に停止します。

そのため、タブ 2 をクリックすると、内部のすべての機能 - (void)viewDidAppear:(BOOL)animated が完了するまで、ユーザーはビューを見ることができます。

ViewDidShowToUser 関数はどこにありますか? 今、私はいくつかの機能を実行しているので、時々遅くなり、ボタンが実際には機能していないと思います..

4

3 に答える 3

4

まず第一に、実装内では[super viewDidLoad]なく呼び出しています[super viewDidAppear:animated]-viewDidAppear:

第 2 に、デバッガーとブレークポイントを使用すると、アプリの動作を人為的に見ることができます。-viewDidAppear:実際の使用では、ユーザーは実際にビューを表示する前にメソッドが返されることに気付かないでしょう。

本当の問題は、作業が完了するまでに時間がかかりすぎて、アプリの動作が遅く見えることです。作業を非同期で実行することを検討する必要があり、それを行うにはいくつかのオプションがあります。

  1. 実装では、作業をキューに入れるためにviewDidAppear:使用できます。performSelector:withObject:afterDelay:このメソッドはすぐに戻り、指定した期間にセレクターが呼び出されるようにスケジュールします。遅延として 0 を渡すと、実行ループの次の繰り返しで実行するためにキューに入れられ、メソッドから戻ってユーザー インターフェイスの応答性を維持する方法が効果的に提供されます。

  2. iOS4 より下を対象としていない場合は、ブロックを使用し、Grand Central Dispatch の機能を利用して作業を適切かつ安全に進めることができます。

于 2010-08-10T15:46:22.587 に答える
1

viewDidLoad: の中で super を呼び出しています: viewDidAppear: ....行[super viewDidLoad];を次のように変更します[super viewDidAppear:animated];

于 2010-08-10T15:36:27.057 に答える
0

簡単に見分ける方法はありません。

UIKit は UIView を作成します。UIView は CALayers に描画します。CALayers は CoreAnimation によって処理されます。

CoreAnimation は、いつ UIView にレイヤーの描画を要求するかを決定します。すべてのレイヤーを画面に描画し、GPU で合成します。それらが合成された後でのみ、更新された UI が画面に表示されます。この分離は、CoreAnimation が UI スレッドとは独立して作業の大部分を実行できるようにするために発生しますが、「実際に画面上にある」ものを簡単に判断できないことを意味します。

画面に実際に何かが表示されたときを簡単に知る方法はありません (非公開の UIGetScreenImage() は別として)。viewDidAppear: UIKit がビュー/レイヤーの構築 (およびアニメーション化) を終了した後に呼び出されます。その時点で、それらは次の実行ループの後に CoreAnimation によって「認識」され、その後すぐに表示されます。viewDidAppear: で多くの処理を行うと、CoreAnimation は更新された「モデル ツリー」を認識しません。

于 2010-08-10T18:30:23.340 に答える