12

ホーム ビュー - 私の RootViewController - ユーザーが次のようにナビゲーション階層を進むにつれて、2 つの ViewController を次々に開きます。

1) SecondViewController は、ストーリーボードに接続されたボタンによって押されます

2) ThirdViewController はモーダルに表示されます

[self performSegueWithIdentifier:@"NextViewController" sender:nil];

したがって、図は次のとおりです。RootViewController -> SecondViewController -> ThirdViewController

ここで、ThirdViewController に、RootViewController に 2 回戻るボタン、つまりホームに戻るボタンが必要です。しかし、これは機能しません:

[self.navigationController popToRootViewControllerAnimated:YES]; 

SecondViewControllerに一度戻るのはこいつだけ

[self.navigationController popViewControllerAnimated:YES];

モーダル ビュー コントローラーとプッシュ ビュー コントローラーの両方を同時に削除するにはどうすればよいですか?

4

3 に答える 3

21

同様の状況があり、多数のビュー コントローラーをナビゲーション コントローラー スタックにプッシュした後、最後のビューがモーダルに表示されました。モーダル画面には、ルート ビュー コントローラーに戻る [キャンセル] ボタンがあります。

モーダル ビュー コントローラーには、[キャンセル] ボタンがタップされたときにトリガーされるアクションがあります。

- (IBAction)cancel:(id)sender
{
    [self.delegate modalViewControllerDidCancel];
}

このモーダル ビュー コントローラーのヘッダーで、プロトコルを宣言します。

@protocol ModalViewControllerDelegate
- (void)modalViewControllerDidCancel;
@end

次に、ナビゲーション スタックの最後のビュー コントローラー (モーダル ビューを表示したもの) がModalViewControllerDelegateプロトコルを実装する必要があります。

- (void)modalViewControllerDidCancel
{
    [self dismissViewControllerAnimated:NO completion:nil];
    [self.navigationController popToRootViewControllerAnimated:YES];
}

上記のこの方法は重要な部分です。表示側のビュー コントローラーを取得してモーダル ビューを閉じた後、ルート ビュー コントローラーに戻ります。モーダル ビューからルート ビューへのアニメーションをよりスムーズにするために、dismissViewControllerAnimated NO: と popToRootViewControllerAnimated:に渡していることに注意してください。YES

于 2013-05-29T23:41:03.967 に答える
4

同じ要件がありましたが、View Controller 間でカスタム セグエを使用していました。iOS6に付いていたと思われる「Unwind Segue」のコンセプトに出会いました。iOS6 以降をターゲットにしている場合は、次のリンクが役立ちます: Unwind セグエとは何ですか? http://chrisrisner.com/Unwinding-with-iOS-and-Storyboards ありがとうございます。

于 2013-05-29T23:57:14.857 に答える
0

AppDelegate が AppDelegate と呼ばれると仮定すると、次のようにして、アプリ ウィンドウの rootviewcontroller をビュー RootViewController としてリセットできます。

AppDelegate *appDel = (AppDelegate*)[[UIApplication sharedApplication] delegate];
RootViewController *rootView = [[RootViewController alloc] init];
[appDel.window setRootViewController:rootView];
于 2013-05-29T23:10:51.267 に答える