6

In my app, I have about a dozen different view controllers, pushed onto or popped from the stack in different orders. When a view has appeared (I'm using viewDidAppear method) I need to determine whether this is because this view has just been pushed onto the stack or because one of its subviews was popped from the stack.

I went through this question: viewWillDisappear: Determine whether view controller is being popped or is showing a sub-view controller

But I don't think it's helping me very much. Any suggestions please?

4

3 に答える 3

4

管理できる場合の最善の解決策は、コントローラーがプッシュされただけなのか、子がポップされただけなのかが問題にならないようにコードを修正することです。基本的に、ビューコントローラは、そのビューとアプリが操作するデータの間を仲介します。そのデータが最新である限り、コントローラーは、ビューが表示される前に何が起こっていたかを気にする必要はありません。データの更新など、アプリの以前の状態に基づいてコントローラーが現在実行しているタスクは、実際には別のクラスに配置する方が適切な場合があります。

ストーリーボードを使用している場合の別の可能性は、-prepareForSegue:sender:の代わりに依存することです-viewDidAppear。そのメソッドで渡されたセグエには、ソースビューコントローラーと宛先ビューコントローラーを識別するプロパティがあります。これは通常、コントローラーが現在のコントローラーになった経緯を示すのに十分な情報です。

これらのいずれも機能しない場合は、構成コードを1つ以上の異なるメソッドに移動することを検討してください。あなたが直面している問題の根本は、-viewWillAppear本当にあなたがそれを必要としていることを意味しないということです。のように、必要なものを意味するメソッドを作成し-childControllerFinishedそれを使用て必要な構成作業を行います。

于 2011-12-21T18:05:59.120 に答える
1

できることは、ビューコントローラにalreadyPushedなどと呼ばれるBOOLプロパティを設定することです。次に、viewDidAppearメソッドで、falseに設定されているかどうか(viewDidAppearが最初に呼び出されるとき)を確認します。

次に、サブビューviewControllerがポップされると、viewDidAppearメソッドは、subviewがポップされたばかりであることがわかっている場合、alreadyPushedプロパティがtrueに設定されているかどうかを確認します。

于 2011-12-21T14:59:53.583 に答える
0

ビューコントローラがスタックにプッシュされると、そのviewDidLoadメソッドが呼び出されます。サブコントローラーがポップされた場合、viewDidLoad呼び出されません。

- (void)viewDidLoad {
    [super viewDidLoad];
    //do any setup you want to do only when the view is pushed onto the
    //stack for the first time; this method will not be called
    //when the view's subview is popped and this one becomes visible
}

したがって、View Controllerを初めて押すときの1回限りのセットアップ、およびビューが表示されるたびに実行するセットアップに使用しますviewDidLoad(または、実行していることによっては) 。UINavigationControllerを使用すると、次の2つのメソッドをUINavigationControllerDelegateプロトコルに実装できます。initWithNibNameviewDidAppear

- (void)navigationController:(UINavigationController *)navigationController 
    willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [viewController viewWillAppear:animated];
    //do any every-time setup *before* the view is shown
}

- (void)navigationController:(UINavigationController *)navigationController 
    didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [viewController viewDidAppear:animated];
    //do any every-time setup *after* the view is shown
}
于 2011-12-21T15:47:23.400 に答える