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 - 用另一个模态视图覆盖模态视图的主要内容,如果未能解决你的问题,请参考以下文章