2

我有一个表视图控制器 A,它对视图控制器 B 执行推送 segue。B 然后对视图控制器 C 执行模态 segue。我在 C 上有一个按钮,需要导致 C 被解雇(其中如前所述,是模态的)并且 B 的弹出,以便我们返回 A。在 C 中,我检测到按钮按下并使用委托回调 B,然后使用以下方法关闭模态视图控制器 C:

[sender dismissViewControllerAnimated:NO completion:nil];

然后 B 使用一个委托回调 A 并使用以下方法从堆栈中弹出 B:

[self.navigationController popViewControllerAnimated:YES];

现在这一切都奏效了,除了在这一切期间我短暂地看到 B 的非常烦人的事实,而我希望能够从 C 直接“弹出”回到 A 而根本看不到 B,无论多么短暂。我已经为上面的动画参数尝试了 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

你可以用下面的代码做你想做的事。首先,您 popToRootViewController 将控制器 B 从堆栈中取出,但不会更改视图,因为 C 的视图已启动。然后在 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 回答
0

在 iOS 6 中,如果你使用 unwind segues,你不会得到那种奇怪的效果。在您想要跳回的视图控制器中,只需定义一个展开操作:

- (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
}

然后在您呈现的视图控制器中(它可以向下多个级别)可以通过从将启动 segue 的按钮向下拖动到场景 Dock 中的“退出”图标来执行展开 segue。它将自动通过、识别和呈现具有展开操作的视图控制器,并呈现这些选择。

最终效果是您可以通过多个模态框和导航控制器跳回,而您只能获得一种动画效果。

同样,遗憾的是,这只是 iOS 6+。

于 2012-12-16T17:53:09.650 回答