【问题标题】:DismissViewController dismissing two UIViewControllersDismissViewController 解散两个 UIViewController
【发布时间】:2014-02-18 06:15:47
【问题描述】:

我以这种方式呈现视图:

- (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:^{}];
}

错误是视图消失了,它后面的视图也立即消失了。

【问题讨论】:

    标签: ios uiview uiviewcontroller presentmodalviewcontroller dismiss


    【解决方案1】:

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

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

    (source)

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

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

    【讨论】:

    • 没错。我使用 UINavigationController 来解决这个问题。
    【解决方案2】:

    根据苹果文档。

    如果你连续呈现几个视图控制器,然后构建 一堆呈现的视图控制器,在视图上调用此方法 堆栈中较低的控制器关闭其直接子视图 控制器和堆栈上该子级上方的所有视图控制器。 发生这种情况时,只有最顶层的视图会在动画中消失 时尚;任何中间视图控制器都被简单地从 堆。最顶层的视图使用其模态转换被关闭 样式,可能与其他视图控制器使用的样式不同 在堆栈中较低。

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

    【讨论】:

      猜你喜欢
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多