关闭 2 个模态视图控制器

Posted

技术标签:

【中文标题】关闭 2 个模态视图控制器【英文标题】:Dismiss 2 modal view controllers 【发布时间】:2012-02-23 20:44:43 【问题描述】:

我有一个基本的模态视图控制器。然后我创建第二个:

FieldReportViewController *fieldReport = [self.storyboard instantiateViewControllerWithIdentifier:@"fieldReportView"];
[self presentModalViewController:fieldReport animated:YES];

从那里,我调用第三个视图控制器:

ScoutingReportViewController *scoutingReport = [self.storyboard instantiateViewControllerWithIdentifier:@"ScoutView"];
[self setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self presentModalViewController:scoutingReport animated:YES];

现在我想回到第一个视图控制器。我试过(这是当前显示的视图控制器):

-(IBAction)doneBtn

    //[self.parentViewController dismissModalViewControllerAnimated:YES];  //removed

    [self dismissModalViewControllerAnimated:NO];    //added

    [[NSNotificationCenter defaultCenter] postNotificationName:@"CloseAllModalViews" object:nil userInfo:nil];  //added


在中间/s视图控制器中,我在viewDidLoad中添加了一个观察者:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(dismissModals:)
                                             name:@"CloseAllModalViews"
                                           object:nil];

和方法:

-(void) dismissModals:(id)sender

    [self dismissModalViewControllerAnimated:NO];

按下时,它什么也不做。它不会拒绝任何意见。

有什么想法可以让它工作吗?

编辑:找出崩溃的原因;我忘记了我在 IB 的完成按钮上添加了一个 segue。这会导致内存问题并导致崩溃。

编辑 2:这会将两个视图控制器解散回基本/第一个视图控制器。它没有给我任何动画。我可以在没有动画的情况下关闭当前的 VC,并在没有动画的情况下关闭中间的 VC,但我在过渡前会短暂看到中间的 VC。如果可能的话,我希望有一个从当前 VC 到基本 VC 的动画。

【问题讨论】:

在设备上运行控制台时没有提示?构建时来自 xcode 的任何警告? 不,当我在 ipad 上运行控制台时,控制台中没有崩溃信息。我注意到 xcode 4.2 提供的反馈比以前版本的崩溃要少得多。 =/ 如果你的第一个视图控制器是一个导航控制器,你可以使用popToRootViewControllerAnimated:。想换吗? 【参考方案1】:

我以前做过这个,我不得不使用 UINotificationCenter 来关闭中间视图。当您按下 doneBtn 时,发布通知。在推送其他视图之前,添加一个以您的dismissModal 作为操作的观察者。如果您删除动画,它应该看起来就像您刚刚回到原始视图。

在您看来,您希望自动关闭:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(dismissModals:)
                                                 name:@"CloseAllModalViews"
                                               object:nil];

把它放在你的 doneBtn 方法中:

[[NSNotificationCenter defaultCenter] postNotificationName:@"CloseAllModalViews" object:nil userInfo:nil];

【讨论】:

太棒了,这确实有效。唯一的缺点是我没有很好的过渡。如果我为当前模态设置动画,则中间模态不会关闭(我猜测,因为当前模态正在动画地关闭,第二次关闭会丢失)。我无法为当前模态设置动画并为中间模态设置动画,但随后我在过渡前简要地看到了第二个模态。我也无法制作动画,直接进入基本模式。我希望有一些动画过渡,你认为这可能吗? (我将使用新代码更新帖子) 如果您希望它们正确设置动画,您可能需要添加一些延迟或时间。我承认这不是解决问题的最优雅的方法,但它确实有效。如果您找到一个不错的解决方法,请发布。

以上是关于关闭 2 个模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何一次关闭 3 个模态视图控制器?

在当前可见之前关闭先前呈现的模态视图控制器

关闭两个模态视图控制器

iPhone - 平滑显示 2 个连续的模态视图控制器

一次关闭多个模态视图控制器?

关闭两个模态(表格)视图控制器