28

私はそれUINavigationControllerに一連の を持っUIViewControllersています。状況によっては、正確に 2 レベル戻したいことがあります。2回続けて呼び出すことでできると思っていましpopViewControllerAnimatedたが、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こと、またはまったく別のものを呼び出すことである場合は、喜んでそれを変更します。

4

4 に答える 4

73

この場合、次のように、navigationController 内の特定のビューコントローラーに戻る必要があります。

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

そのコードは、navigationController のスタックの 3 番目のビューコントローラーにポップします。

于 2009-07-14T01:16:44.473 に答える
21

スタック内のView Controllerの数を数えてから、ポップしたいView Controllerの数を差し引く方が良いと思います。

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

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

于 2011-09-15T15:13:45.720 に答える
2

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.
}
于 2013-07-13T02:44:26.570 に答える
1

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

于 2011-09-22T15:35:53.717 に答える