Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 显示第n个视图控制器,但不显示其根VC_Ios_Objective C - Fatal编程技术网

Ios 显示第n个视图控制器,但不显示其根VC

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视图层次结构,这样我就可以通过正常的弹出窗口返

假设我有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我使用模态
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中)。因此,当你打开应用程序时,它将首先加载一个<