4

IOS5 ストーリーボードを使用しています。私のView Controllerのパスは次のとおりです。

tabbarVC --> navigationVC-1 --> tableVC-1 --(via segue push)-> tableVC-2 --(via segue modal)-> navigationVC-2 --> tableVC-3

tableVC-3 のキャンセル ボタン コールバック アクション メソッドで呼び出し[self dismissViewControllerAnimated:YES completion:nil]; て、正常に tableVC-2 に戻ります。ただし、デバッガーでナビゲーション パスを逆方向に調べようとすると、navigationVC-2 から tableVC-2 にアクセスする方法がわかりません。私は、navigationVC-2 が tableVC-2 または navigationVC-1 へのリンクを維持することを期待していましたが、そうではないようです。以下の私のデバッガ出力を見てください。

誰かがナビゲーション階層と、プログラムでチェーンを逆方向にトラバースする方法を説明できますか?

(gdb) po self
<tableVC-3: 0x6d33340>

(gdb) po (UIViewController*) [self navigationController]
<UINavigationController: 0x6d33560>

(gdb) po (UIViewController*)[[self navigationController] navigationController]
Can't print the description of a NIL object.

(gdb) po (UIViewController*)[[self navigationController] topViewController]
<tableVC-3: 0x6d33340>

(gdb) po (UIViewController*)[[self navigationController] presentingViewController]
<UITabBarController: 0x6b2eba0>

(gdb) po (UIViewController*)[[self navigationController] presentedViewController]
Can't print the description of a NIL object.

(gdb) po (UIViewController*)[[self navigationController] visibleViewController]
<tableVC-3: 0x6d33340>
4

4 に答える 4

8

これは古い質問ですが、この問題に遭遇した他の人を助けるために、あなたの人生を楽にする単一のコマンドがあります..

[self.navigationController popToRootViewControllerAnimated:TRUE];

適切なコマンドに出くわすと簡単ですよね!

たとえば、Navigation Controller に一連の 3 つの画面があり、3 番目の画面で「戻る」ボタンを使用して最初の画面に戻るとします。

-(void)viewDidLoad
{
    [super viewDidLoad];

    // change the back button and add an event handler
    self.navigationItem.leftBarButtonItem =
    [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                     style:UIBarButtonItemStyleBordered
                                    target:self
                                    action:@selector(handleBack:)];
}


-(void)handleBack:(id)sender
{
    NSLog(@"About to go back to the first screen..");
    [self.navigationController popToRootViewControllerAnimated:TRUE];
}
于 2012-09-13T11:53:04.373 に答える
4

より完全になるように更新するのは難しい古い応答をスローします。
この質問に対処するには:

誰かがナビゲーション階層と、プログラムでチェーンを逆方向にトラバースする方法を説明できますか?

ナビゲーションの構造:

tabbarVC-> NavigationVC-1-> tableVC-1-(セグエプッシュ経由)-> tableVC-2-(セグエモーダル経由)-> NavigationVC-2-> tableVC-3

次のように説明できます:
TabbarVCは、「selectedViewController」(navigationVC-1)を表示しています。
NavigationVC-1のナビゲーションスタックはTableVC-1とTableVC-2(NavigagtionVC-1のtopViewController)で構成
されています。次に、NavigationVC-2はtabbarVC上にモーダルで表示されるため、tabbarVCはでありpresentingViewController、NavigationVC-2はpresentedViewController

したがって、tableVC-3からtableVC-2に到達するには、次のようなことを行う必要があります。

[(UINavigationController *)[(UITabBarController *)[tableVC-3 presentingViewController] selectedViewController] topViewController];

(本番コードではそれを行わないでください)

[tableVC-3 presentingViewController]だけでなく、[tableVC-3.navigationController presentingViewController]あなたに戻ってきますUITabBarController


UINavigationControllerを使用している場合は、そのpushメソッドpopを使用してUIViewControllerを「プレゼンテーションスタック」に配置または配置解除する必要があります。次のようなものから
にアクセスできるようになります。UINavigationControllerUIViewController

self.navigationController

UIViewController「プレゼンテーションスタック」で複数に戻りたい場合は、このメソッドを使用できます。UINavigationController

popToViewController:animated:
指定されたViewControllerがナビゲーションスタックの最上位になるまでViewControllerをポップします。
-(NSArray *)popToViewController:(UIViewController *)viewControllerアニメーション:(BOOL)アニメーション


モーダルで提示されたUIViewControllerUIViewControllerを閉じるには、それを提示したUIViewControllerを次のように閉じる必要があります。

- (void)dismissModalViewControllerAnimated:(BOOL)animated

したがって、この場合は次のようになります。

[tableVC-2 dismissModalViewControllerAnimated:YES];
于 2012-01-02T05:45:53.903 に答える
4

これを使用したいくつかの調査と、ストーリーボードのモーダル UIViewControllers に関する他のいくつかの質問を行った後、使用した 2 つのビューに戻ります

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
于 2013-07-31T08:44:29.850 に答える