iPhone - 用另一个模态视图覆盖模态视图

Posted

技术标签:

【中文标题】iPhone - 用另一个模态视图覆盖模态视图【英文标题】:iPhone - Cover a modal View with another modal View 【发布时间】:2011-10-22 11:25:07 【问题描述】:

我有一个主视图。 从该主视图中,我显示了一个模态视图 (MV1)。 MV1 可能会显示另一个模态视图 (MV2)。 从 MV2,我可能会展示另一个模态视图(MV3)。

所有 MV 都以动画形式显示。

我想要的是能够在“杀死”前一个模式视图 (MVx) 之前先显示(动画)下一个模式视图 (MVx+1)。

如果我在显示 MVx+1 之前关闭(动画)MVx:MVx+1 不会出现。 如果我在显示 MVx+1 之前关闭(非动画)MVx:看到 MVx-1。 如果我在关闭(非动画)MVx 之前显示 MVx+1:MVx+1 不会出现。

我该怎么办?

如果您有时间,一些代码示例会有所帮助,但详细说明就足够了。

【问题讨论】:

在显示MVx+1时绝对有必要杀死MVx @Sean :不,但我不希望 MVx+1 不得不处理一些以前显示的视图。杀死 MV3 时,我想回到 MV1(无论 MV1 可能是什么,以及在 MV1 和 MV3 之间显示的任何视图)。 【参考方案1】:

根据 Apple 文档,消除模态视图的公认方法是让父控制器(即创建模态视图的视图控制器)进行消除。最好的方法是将父控制器设置为模态视图控制器的委托。这里的想法是模态控制器告诉其父级它已准备好被解雇,并且父级决定从那里采取什么行动。

为此,您必须为父控制器实现的模态视图控制器创建一个委托协议。在您的情况下,您可以在每个 .h 文件的顶部为您的模态视图创建一个协议来执行此操作(或者,如果所有模态视图都可以使用相同的方法进行解除,则可以在单独的文件中创建一个协议)。例如:

@protocol MYModalViewDelegate <NSObject>
    -(void)dismiss;
@end

接下来,在每个模态视图控制器中,为委托创建一个实例变量:

@interface MYModalViewController1 : UIViewController 
    id<MYModalViewDelegate> delegate;

当您从当前视图控制器显示模态视图时,请将当前控制器设置为委托。

MYModalViewController1 * mvc1 = [[MYModalViewController1 alloc] initWithNibName:@"MYModalViewController1" bundle:nil];
mvc1.delegate = self;
[self presentModalViewController:mvc1 animated:YES];
[mvc1 release];

当你想释放当前的模态控制器时,让模态视图控制器在其委托上调用适当的协议方法:

[self.delegate dismiss];

现在,代理可以处理下一步要去哪里了。在您的情况下,您可以在 MV3 关闭时自动关闭 MV2,方法是在 MV3 中调用 [self.delegate dismiss],然后在 MV2 中实现 dismiss

-(void)dismiss 
    [self dismissModalViewControllerAnimated:YES];
    [self.delegate dismiss];

【讨论】:

如果我理解的话,你可以从另一个模态视图打开一个模态视图,不是吗?

以上是关于iPhone - 用另一个模态视图覆盖模态视图的主要内容,如果未能解决你的问题,请参考以下文章

显示模态视图时使 iPhone 状态栏消失?

iPhone - 在另一个模态视图中嵌套当前模态视图

呈现模态视图控制器时 iPhone 崩溃

iPhone 模态视图动画帮助

iPhone:模态视图未关闭

iPhone:模态视图控制器的代表