一連の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
、または他の何かを完全に呼び出すことである場合、私は喜んでそれを変更します。
この場合、次のように、navigationControllerの特定のviewcontrollerに戻る必要があります。
[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES];
そのコードは、navigationControllerのスタックの3番目のviewcontrollerにポップされます。
スタック内のビューコントローラーの数を数えてから、ポップしたいビューコントローラーの数を引く方が良いと思います。
NSInteger noOfViewControllers = [self.navigationController.viewControllers count];
[self.navigationController
popToViewController:[self.navigationController.viewControllers
objectAtIndex:(noOfViewControllers-2)] animated:YES];
このソリューションを使用すると、後でプロジェクトに新しいビューを追加しても、ポップを台無しにすることはありません。
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.
}
また、あなたが間違っていたことについては、私は[self.navigationController popViewControllerAnimated:YES]
が2回目に機能しないのは、おそらく最初の呼び出しでポップされている画面でこの2番目の呼び出しを行っているためです。最初の呼び出しの後、現在のビューはナビゲーションコントローラーから削除されるため、2番目の呼び出しを行うまでにself.navigationController
にはナビゲーションコントローラーがないため、nilが返されます。