DismissViewController解雇两个UIViewControllers

时间:2014-01-27 12:01:13

标签: ios uiview uiviewcontroller presentmodalviewcontroller dismiss

我以这种方式提出观点:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ContractDetailsViewController *contractDetailsViewController = [[ContractDetailsViewController alloc] init];
    contractDetailsViewController.client = self.client;
    contractDetailsViewController.contractId = [NSString stringWithFormat:@"%d", indexPath.row];

    [self presentViewController:[[UINavigationController alloc]initWithRootViewController:contractDetailsViewController] animated:YES completion:^{
    }];
}

视图出现后我将其解雇:

- (void)close
{
    [self dismissViewControllerAnimated:YES completion:^{}];
}

错误是视图消失,其背后的视图也随之消失。

2 个答案:

答案 0 :(得分:2)

这可以解释您的视图控制器发生了什么:

  

如果您连续呈现多个视图控制器,从而构建一堆呈现的视图控制器,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器以及堆栈上该子视图上方的所有视图控制器。发生这种情况时,只有最顶层的视图以动画方式被删除;任何中间视图控制器都可以从堆栈中删除。最顶层的视图使用其模态过渡样式被忽略,这可能与堆栈中较低的其他视图控制器使用的样式不同。

source

这意味着如果您呈现视图控制器A,然后查看控制器B,然后在视图控制器B上调用dismiss,则两个视图控制器都被关闭(尽管只有B带有动画)。

如果要管理两个不同的视图控制器层次结构,可以使用第二个导航控制器。这意味着,例如,您将呈现新的导航控制器而不是视图控制器A,并使视图控制器A成为导航控制器的根控制器。然后你可以推/弹任何其他所需的视图控制器(B等)

答案 1 :(得分:0)

根据苹果文档。

  

如果您连续呈现多个视图控制器,那么构建   一堆呈现的视图控制器,在视图上调用此方法   堆栈中较低的控制器会解除其直接的子视图   控制器和堆栈上该子节点上方的所有视图控制器。   发生这种情况时,只有最顶层的视图在动画中被解除   时尚;任何中间视图控制器都可以从中删除   堆。最顶层的视图使用其模态转换被忽略   样式,可能与其他视图控制器使用的样式不同   在堆栈中较低。

如果您想要实现该功能,只需在当前视图中添加UIViews并以模态方式显示它们。您可以逐个删除它们。