Objective-C - 同时关闭表单和页面表

时间:2013-07-12 15:51:16

标签: ios objective-c uiviewcontroller dismiss uimodalpresentationstyle

我有一个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中的dismiss,并在选择器调用中调用dismiss(带动画:表单的NO),它似乎正常运行,但我不知道这是不是我应该修理它。

1 个答案:

答案 0 :(得分:1)

尝试在页面表上调用dismissViewControllerAnimated:completion :.根据Apple的文档:

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

如果这不是你想要的行为,那么你应该使用dismissViewControllerAnimated中的completion handler参数:completion:传入一个块,然后从完成处理程序中解除另一个视图控制器,例如:

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

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