web-dev-qa-db-ja.com

popViewControllerAnimatedを2回呼び出す

一連のUINavigationControllerが付いたUIViewControllersがあります。状況によっては、正確に2つのレベルをポップバックしたいと思います。 popViewControllerAnimatedを2回続けて呼び出すことで実行できると思いましたが、2回目に呼び出すと、何もポップされず、代わりにNULLが返されます。宛先への参照を保存する必要がありますかVC代わりにpopToViewControllerAnimatedを呼び出す必要がありますか?それはできますが、UIViewController *を渡す必要があるため、コードが複雑になります。 VCをスタックにプッシュしているときに。

関連するスニペットは次のとおりです。

UIViewController* one = [self.navigationController popViewControllerAnimated:YES];
if (...) {
    // pop twice if we were doing XYZ
    UIViewController *two = [self.navigationController popViewControllerAnimated:YES];
    // stored in "one" and "two" for debugging, "two" is always 0 here.
}

私はここで何か変なことをしていますか?慣用的なコードを書きたいので、「正しい」方法がpopToViewControllerAnimated、または他の何かを完全に呼び出すことである場合、私は喜んでそれを変更します。

26
Mike Kale

この場合、次のように、navigationControllerの特定のviewcontrollerに戻る必要があります。

[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES];

そのコードは、navigationControllerのスタックの3番目のviewcontrollerにポップされます。

68
Ben Harris

スタック内のビューコントローラーの数を数えてから、ポップしたいビューコントローラーの数を引く方が良いと思います。

 NSInteger noOfViewControllers = [self.navigationController.viewControllers count];
 [self.navigationController 
 popToViewController:[self.navigationController.viewControllers 
 objectAtIndex:(noOfViewControllers-2)] animated:YES];

このソリューションを使用すると、後でプロジェクトに新しいビューを追加しても、ポップを台無しにすることはありません。

19
Flatron

UINavigationViewControllerへの参照を保存し、保存されたインスタンスを使用すると、私にとってはうまくいきます。

UINavigationViewController* savedUinvc = self.navigationController;
UIViewController* one = [savedUinvc  popViewControllerAnimated:YES];
if (...) {
    // pop twice if we were doing XYZ
    UIViewController *two = [savedUinvc  popViewControllerAnimated:YES];
    // stored in "one" and "two" for debugging, "two" is always 0 here.
}
2

また、あなたが間違っていたことについては、私は[self.navigationController popViewControllerAnimated:YES]が2回目に機能しないのは、おそらく最初の呼び出しでポップされている画面でこの2番目の呼び出しを行っているためです。最初の呼び出しの後、現在のビューはナビゲーションコントローラーから削除されるため、2番目の呼び出しを行うまでにself.navigationControllerにはナビゲーションコントローラーがないため、nilが返されます。

1
Scott Pfeil