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

时间:2011-10-22 11:25:08

标签: iphone ios cocoa-touch uiviewcontroller modalviewcontroller

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

所有MV都显示为动画。

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

如果我在显示MVx + 1之前解雇(动画)MVx:MVx + 1没有出现。
如果我在显示MVx + 1之前解除(非动画)MVx:看到MVx-1 如果我在解雇(非动画)MVx之前显示MVx + 1:MVx + 1没有出现。

我该怎么办?

如果您有时间,一些代码示例会有所帮助,但只需详细说明即可。

1 个答案:

答案 0 :(得分: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中调用[self.delegate dismiss]来关闭MV3时自动关闭MV2,然后在MV2中实现dismiss

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