0

我有一个 UINavigationController,我在其中推送一个具有 UIModalPresentationPageSheet 演示样式的视图控制器。

在此页面表的视图控制器中,我展示了一个具有 UIModalPresentationFormSheet 样式的视图控制器。

当用户在表单上点击“完成”按钮时,我想关闭表单和页面。

在完成按钮的操作中:

-(IBAction)onDone:(id)sender
{
  if(self->delegate && [self->delegate respondsToSelector:self->actionSelector])
  {
    [self->delegate performSelector:self->actionSelector withObject:[NSString stringWithString:self.textView.text]];
  }

  [self dismissViewControllerAnimated:YES completion:nil];
}

委托是页面表的视图控制器,在选择器中,我关闭页面表:

[self dismissViewControllerAnimated:YES completion:nil];

当我运行它时,我得到:

Warning: Attempt to dismiss from view controller <UINavigationController: 0xa9381d0> while a presentation or dismiss is in progress!

我可以看到为什么会发生这种情况 - 因为在关闭表单视图之前调用了选择器,但我不知道解决这个问题的最佳方法。

我已经尝试在 onDone 中删除关闭,并在选择器调用中调用两者的关闭(对于表单表使用动画:NO),它似乎可以正常工作,但我不知道这是否是我应该接近的方式修复它。

4

1 回答 1

1

尝试在页面表上调用dismissViewControllerAnimated:completion:。根据苹果的文档:

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

如果这不是您想要的行为,那么您应该在dismissViewControllerAnimated:completion: 中使用完成处理程序参数来传递一个块,然后从完成处理程序中关闭另一个视图控制器,例如:

[formSheetViewController dismissViewControllerAnimated:YES completion:^{
    [pageSheetViewController dismissViewControllerAnimated:YES competion:nil];
}

虽然真的,我认为只是解雇页面应该对你有用。了解完成处理程序的工作原理仍然很好。它可以让你在操作完成后做一些工作——非常方便。

于 2013-07-12T16:57:39.593 回答