2

ビューコントローラーBにプッシュセグエを行うテーブルビューコントローラーAがあります.BはビューコントローラーCにモーダルセグエを行います.Cにボタンがあり、Cを却下する必要があります(前述のようにモーダルです) また、A に戻るように B のポッピングも行われます。C では、ボタンの押下を検出し、デリゲートを使用して B にコールバックし、これを使用してモーダル ビュー コントローラー C を閉じます。

[sender dismissViewControllerAnimated:NO completion:nil];

次に、B はデリゲートを使用して A にコールバックし、A はこれを使用してスタックから B をポップします。

[self.navigationController popViewControllerAnimated:YES];

これですべて機能しますが、このすべての間に B が簡単に表示されるという非常に厄介な事実を除いて、B をまったく表示せずに C から A に「ポップ」できるようにしたいと考えています。上記の Animated パラメータに対して YES/NO の組み合わせを試し、popToRootViewControllerAnimated も試しましたが、うまくいきません :-(

誰にもアイデアはありますか?

4

4 に答える 4

1

私は簡単なプロジェクトをまとめましたが、このコードを使用するとうまくいくように見えました:

[self dismissViewControllerAnimated:YES completion:nil];
// Just a coincidence that this is the presenting VC rather than a regular UIViewController I think. 
UINavigationController *navController = (UINavigationController *)self.presentingViewController;
[navController popViewControllerAnimated:NO];

これは Github のサンプル プロジェクトです: https://github.com/MaxGabriel/iOSNavigationFlow

于 2012-12-16T06:45:20.237 に答える
0
[self.navigationController popViewControllerAnimated:NO];
于 2012-12-16T07:14:53.047 に答える
0

iOS 6 では、アンワインド セグエを使用すると、奇妙な効果は得られません。ジャンプして戻りたいビュー コントローラーで、アンワインド アクションを定義するだけです。

- (IBAction)home:(UIStoryboardSegue *)segue
{
    // if you need to do any UI update because we got an unwind segue
    // back to this controller, do that here
}

次に、提示されたView Controller(および複数レベル下になる可能性があります)で、セグエを開始するボタンからシーンのドックの「終了」アイコンまでドラッグすることにより、セグエの巻き戻しを行うことができます。これは、巻き戻しアクションを持つビュー コントローラーを自動的に通過し、識別して提示し、それらの選択肢を提示します。

最終的な効果は、複数のモーダルとナビゲーション コントローラーをジャンプして戻ることができ、1 つのアニメーション効果しか得られないことです。

繰り返しますが、これは悲しいことに iOS 6+ のみです。

于 2012-12-16T17:53:09.650 に答える
0

次のコードを使用して、必要なことを行うことができます。まず、コントローラ B をスタックから取り出しますが、C のビューがアップしているため、ビューを変更しない popToRootViewController を作成します。次に、ナビゲーション コントローラーのビューを C のビューの下に追加して、ビュー階層にあるが表示されないようにします。次に、アニメーションを実行して C のビューを右にスライドさせ、最後にモーダル ビュー コントローラーを閉じます。入力を短くするためにプロパティ nav を作成しましたが、実際には必要ありません。このコードは、モーダル ビュー コントローラーの .m にあります。

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.nav = (UINavigationController *)self.presentingViewController;
}

-(IBAction)goBackToRoot: (UIButton *) sender {
    [self.nav popToRootViewControllerAnimated:NO];
    [self.view.window insertSubview:self.nav.view belowSubview:self.view];
    [UIView animateWithDuration:.6 animations:^{
        self.view.frame = CGRectMake(330, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
    } completion:^(BOOL finished) {
        [self.nav dismissViewControllerAnimated:NO completion:nil];
    }];
}
于 2012-12-16T17:48:06.543 に答える