Ios 显示第n个视图控制器,但不显示其根VC
假设我有3个控制器(A、B、C)。A和C是视图控制器,B是导航控制器。正常的应用程序流是A作为根视图,A当前(模式)B,B推送C。 我想要的是将C显示为俯视图控制器,而不需要通过A-B-C中的所有动画,但仍然具有层次结构(意味着C可以返回到A),这可能吗 我们可以直接将WindowRooViewController设置为C,但它没有层次结构 编辑: 也许我的问题还不够清楚,这里的重点是,当我打开我的应用程序时,我想直接显示C,但仍然有一个->B->C视图层次结构,这样我就可以通过正常的弹出窗口返回到A并关闭 EDIT2: 我设法用B-C层次结构显示C,这样我就可以从C跳回B。现在我的问题是如何从A(ViewController)显示B(NavigationController),这样当我关闭B时,它将**关闭*到A EDIT3: 我看到了一些使用NavigationController的答案,它工作但不是我想要的,因为通常从A到B我使用模态Ios 显示第n个视图控制器,但不显示其根VC,ios,objective-c,Ios,Objective C,假设我有3个控制器(A、B、C)。A和C是视图控制器,B是导航控制器。正常的应用程序流是A作为根视图,A当前(模式)B,B推送C。 我想要的是将C显示为俯视图控制器,而不需要通过A-B-C中的所有动画,但仍然具有层次结构(意味着C可以返回到A),这可能吗 我们可以直接将WindowRooViewController设置为C,但它没有层次结构 编辑: 也许我的问题还不够清楚,这里的重点是,当我打开我的应用程序时,我想直接显示C,但仍然有一个->B->C视图层次结构,这样我就可以通过正常的弹出窗口返
presentViewController
,从B到A我使用dismissViewController
EDIT4:
到目前为止我得到的是
self.window.rootViewController = vcA;
[self.window makeKeyAndVisible];
[vcA presentViewController:vcB animated:NO completion:nil];
[vcB pushViewController:vcC animated:NO];
这将提供我想要的正确层次结构,但它会提供快速动画(闪烁),显示a和C,并警告开始/结束外观转换的不平衡调用。
EDIT5:
我最终忽略了警告并坚持我的上一个答案(但仍然欢迎另一个解决方案)。对于闪烁问题,我使用下面的解决方法
uiview *overlay = [new uiview]; // using vcA.frame
overlay.backgroundColor = white; // I use dominant color of vcC
vcA addSubview:overlay;
self.window.rootViewController = vcA;
[self.window makeKeyAndVisible];
[vcA presentViewController:vcB animated:NO completion:^{
[overlay removeFromSuperview];
}];
[vcB pushViewController:vcC animated:NO];
这将掩盖眨眼行为,因此没有人会注意到(我希望:-p)为什么不使用
presentViewController
编辑:
A->C:
在vcB中,我将添加一个布尔属性,指示我们是否在上述流中,并以以下方式在vcA中呈现vbB:
// We are in vcA where you want to present vcB and vcC
vcB.transient = YES;
[vcA presentViewController:vcB animated:NO completion:^{
[vcB pushViewController:vcC animated:NO];
}];
C->A
当您想返回vcA时,弹出vcC将调用vcB中的viewdide
// We are in vcB
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if(self.transient == YES) {
[self dismissViewControllerAnimated:NO completion:nil];
return;
}
}
使用此解决方案,当您从vcC返回到vcA时,您将临时看到vcB,因为我们必须等待调用viewdide
编辑2:
或者,如果您不需要直接从vcC返回vbA,只需使用第一段代码(不需要瞬态属性)。为什么不使用
presentViewController将C显示在控制器上
编辑:
A->C:
在vcB中,我将添加一个布尔属性,指示我们是否在上述流中,并以以下方式在vcA中呈现vbB:
// We are in vcA where you want to present vcB and vcC
vcB.transient = YES;
[vcA presentViewController:vcB animated:NO completion:^{
[vcB pushViewController:vcC animated:NO];
}];
C->A
当您想返回vcA时,弹出vcC将调用vcB中的viewdide
// We are in vcB
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if(self.transient == YES) {
[self dismissViewControllerAnimated:NO completion:nil];
return;
}
}
使用此解决方案,当您从vcC返回到vcA时,您将临时看到vcB,因为我们必须等待调用viewdide
编辑2:
或者,如果不需要直接从vcC返回vbA,只需使用第一段代码(不需要瞬态属性)。使用a,然后调用
setViewControllers(_:animated:)
使用此方法更新或替换当前视图控制器堆栈,而无需显式推送或弹出每个控制器。在里面
此外,此方法允许您更新控制器集,而无需
设置更改的动画,这可能适用于启动时
您希望将导航控制器返回到以前的状态
如果启用了动画,此方法将决定动画的类型
根据项目中的最后一个项目是否
阵列已在导航堆栈中。如果视图控制器是
当前在堆栈中,但不是最上面的项,此方法使用
流行音乐的转变;如果它是最上面的项,则不允许转换
表演。如果视图控制器不在堆栈上,则此方法
使用推送转换。仅执行一次转换,但在
转换完成后,堆栈的所有内容都将被删除
替换为新的视图控制器。例如,如果控制器A,
B、 和C在堆栈上,设置控制器D、A和B,如下所示
方法使用pop转换,结果堆栈包含
控制器D、A和B
如果对您有帮助,请告诉我:)请先打电话,然后再打电话
setViewControllers(_:animated:)
使用此方法更新或替换当前视图控制器堆栈,而无需显式推送或弹出每个控制器。在里面
此外,此方法允许您更新控制器集,而无需
设置更改的动画,这可能适用于启动时
您希望将导航控制器返回到以前的状态
如果启用了动画,此方法将决定动画的类型
根据项目中的最后一个项目是否
阵列已在导航堆栈中。如果视图控制器是
当前在堆栈中,但不是最上面的项,此方法使用
流行音乐的转变;如果它是最上面的项,则不允许转换
表演。如果视图控制器不在堆栈上,则此方法
使用推送转换。仅执行一次转换,但在
转换完成后,堆栈的所有内容都将被删除
替换为新的视图控制器。例如,如果控制器A,
B、 和C在堆栈上,设置控制器D、A和B,如下所示
方法使用pop转换,结果堆栈包含
控制器D、A和B
如果对您有帮助,请告诉我:)将A保留为rootVC(在ApplicationdFinishLaunching中)。因此,当你打开应用程序时,它将首先加载一个
加载A后(在viewDidLoad中)调用方法来呈现B(呈现时保持动画=否)
加载B时,调用一个方法将其推送到C(在推的同时保持动画=否)
希望这有帮助 将A保留为rootVC(在ApplicationIDFinishLaunching中)。因此,当你打开应用程序时,它将首先加载一个<