4

-viewWillAppear:一致せずに呼び出される方法があるかどうか疑問に思ってい-viewDidAppear:ます。-viewWillDisappearと についても同様です-viewDidDisappear

私の質問の根本は、ビューコントローラーがビューを更新する原因となる変更通知であるオブジェクトの KVO および/または NSNotifications を登録および登録解除する場所です。

たとえば、非同期で処理されているモデル オブジェクトがあり、その文字列プロパティが変更される可能性があります。View ControllerにこれらのプロパティをKVOさせ、そのView Controllerが管理するラベルのテキストを交換することで変更を反映させたいと思います。

通知の登録と登録解除はどこで行いますか?その理由は?

編集:

私が遭遇した落とし穴は、アプリケーションの状態が変化した場合の対処方法です (例: -applicationWillResignActive-...didEnterBackgroundなど)。これらの変更は、ビュー コントローラーのライフサイクル メソッドをトリガーしないようです。ここにベストプラクティスはありますか?

4

2 に答える 2

6

標準のコンテナ ビュー コントローラを使用すると、常に will/d メッセージをペアで取得できます。独自の View Controller コンテナを作成したことがある場合はそうではないかもしれませんが、それはコンテナ実装のバグです。

ほとんどの場合、'will' メッセージで物事を設定したり、解体したりしたいと思うでしょう。これにより、View Controller は、「アクティブ」になる前に必要なすべての処理を実行できるようになり、必要がなくなったときにできるだけ早くシャットダウンすることもできます。

ナビゲーション スタックでビュー コントローラーをプッシュする場合、プッシュ アニメーション中に通知が発生する可能性は十分にあります。viewDidAppear でオブザーバーを設定すると、その通知を見逃す可能性があります。あなたはできるだけ早く聞きたいです。

同様に、viewDidDisappear は遅すぎてコールバックを削除できないと思います。たとえば、場所マネージャーは viewDidDisappear で停止できますが、アニメーションが消える間に別の場所の更新が配信される可能性があります。これはおそらく大きな問題にはなりませんが、アプリケーションによっては、View Controller から離れた後に警告ビューが表示されるなど、奇妙なことが起こる可能性があります。これは、ユーザーにはちらつきのように見えます。

上記のように、ビューに関連しないものはすべて「will」メソッドで発生します。したがって、意志か行動かの選択は、実際にはユーザーが見るものに関するものです。アニメーションは viewDidAppear で開始する必要があります。そうしないと、表示中に発生するフレームがユーザーに表示されません。データは viewWillAppear のビューに移動する必要があります。そうしないと、空白のビューが遷移し、遷移アニメーションが完了した後にのみデータが表示されます。また、ナビゲーション バーを非表示/表示するスタック内の以前のビュー コントローラーの場合のように、viewWillAppear/viewDidAppear の間でビュー フレームを調整することもできます。

余談ですが、ここで詳しく説明するものではありませんが、モデルからビュー オブジェクトにデータを移動するコントローラーのやり取りについては、KVO に反対することをお勧めします。テストが難しく、追跡が困難です。

于 2013-06-29T19:17:50.533 に答える
0

あなたはあなたのサブクラスを作ることができUILabel、あなたのサブクラスでsetTextメソッドをオーバーライドすることができます:

-(void)setText:(NSString *)newText {

    //do your KVO updates here

    [super setText:newText];
}

お役に立てれば

于 2013-03-13T18:44:14.853 に答える