我有一个表视图控制器,A,它向视图控制器执行push 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,无论如何。我已尝试上面的Animated参数的YES / NO组合,也试过popToRootViewControllerAnimated,但没有运气: - (
有人有什么想法吗?
答案 0 :(得分: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
答案 1 :(得分:0)
[self.navigationController popViewControllerAnimated:NO];
答案 2 :(得分: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];
}];
}
答案 3 :(得分:0)
在iOS 6中,如果使用展开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的按钮向下拖动到场景停靠栏中的“exit”图标来进行展开segue。它将自动通过,识别和呈现具有展开动作的视图控制器,并呈现这些选择。
净效果是您可以跳回多个模态和导航控制器,并且只能获得一个动画效果。
同样,这只是iOS 6+的遗憾。