关闭两个模态(表格)视图控制器
Posted
技术标签:
【中文标题】关闭两个模态(表格)视图控制器【英文标题】:Dismiss two modal (table)view controllers 【发布时间】:2012-06-21 11:11:25 【问题描述】:我知道这里有 3-5 个类似的问题,但没有一个答案能解决我的问题。
我有一个 ViewController 打开一个模态(表格)视图控制器,它打开另一个。两个模态视图控制器实际上都是表视图控制器。我正试图从第二个中解雇他们两个。我尝试了所有已接受的类似问题的答案,但没有一个对我有用。
我试过了
[self dismissModalViewControllerAnimated:true]
[self.parentViewController dismissModalViewControllerAnimated:true]
[self.parentViewController.parentViewController dismissModalViewControllerAnimated:true]
[self.presentingViewController dismissModalViewControllerAnimated:true]
[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:true]
当我尝试选项 2、3 和 5 时,什么都没有发生。当我使用选项 1 和 4 时,我看到关闭模态视图动画和底层视图本身,然后一切都返回到第二个模态视图(这次没有动画)。
我开始认为这与我将 tableViewControllers 用于模态视图这一事实有关。
顺便说一句,我正在关闭 didSelectRowAtIndexPath 中的模态视图。
【问题讨论】:
你试过先叫 4 再叫 1 吗? 我刚刚尝试了你的建议,我得到了程序行为,就像我单独使用这些选项中的任何一个时一样(我有一个简短的返回到底层模式视图,并且然后立即恢复到最后一个) ***.com/questions/4955638/… @pie。正如您从我的原始帖子中看到的那样,我尝试了这两个答案(来自您引用的帖子)并且没有一个解决了我的问题。 【参考方案1】:试试这个:-
当您关闭您的SecondView
时,在应用程序委托文件中设置BOOL
标志变量,并在您的FirstView
的viewWillAppear
方法中检查该变量是否SecondView 已打开和关闭。如果是,那么[self dismissModalViewControllerAnimated:true]
【讨论】:
-1 错误的架构选项。您正在创建UIViewController
和 AppDelegate
之间的依赖关系。当您进行开发时,您应该着眼长远,采用这种方法不利于松散耦合。
我的灵感来自您的解决方案,错误我不使用委托文件。实际上,我什至不知道它们是什么。【参考方案2】:
典型的模型视图控制器行为会建议您从调用视图控制器而不是从 self.不是硬性规定,而是良好的做法。
为此,创建一个协议:
@protocol MyModalViewControllerDelegate
- (void)modalViewControllerDidFinish;
@end
并使 parentViewController 和 FirstModalViewController 成为该协议的实现者。
@interface FirstModalViewController <MyModalViewControllerDelegate>
然后在 FirstModalViewController.h 和 SecondModalViewController.h 中,添加:
@property id<MyModalViewControllerDelegate> modalViewControllerDelegate
在 parentViewController 和 FirstModalViewController 中,在调用 presentModalViewController:... 之前,设置以下内容:
modalViewControllerAboutToAppear.modalViewControllerDelegate = self;
[self presentModalViewController:modalViewControllerAboutToAppear animated:YES];
接下来,在 SecondModalViewController 中,在您确定需要关闭项目的代码中,调用
[self.modalViewControllerDelegate modalViewControllerDidFinish];
现在,在 FirstModalViewController 中,实现以下内容:
- (void)modalViewControllerDidFinish:(MyModalViewController*)controller
[self dismissModalViewControllerAnimated:YES]
[self.modalViewControllerDelegate modalViewControllerDidFinish];
最后,在父视图控制器中,您应该能够执行:
- (void)modalViewControllerDidFinish:(MyModalViewController*)controller
[self dismissModalViewControllerAnimated:YES]
【讨论】:
【参考方案3】:由于我不使用委托文件,所以我做了以下操作:
给FirstView
添加字段
BOOL mClose;
到FirstView
添加方法
- (void)close
mClose = YES;
到FirstView
方法viewDidAppear
添加
if (mClose)
[self dismissModalViewControllerAnimated:YES];
到 FirstView
打开 SecondView
的方法添加
[secondView closeWhenDone:self];
给SecondView
添加字段
FirstView *mParent;
给SecondView
添加方法
- (void)closeWhenDone:(FirstView*)parent
mParent = parent;
添加到关闭它的SecondView
方法
[mParent close];
【讨论】:
以上是关于关闭两个模态(表格)视图控制器的主要内容,如果未能解决你的问题,请参考以下文章