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

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 标志变量,并在您的FirstViewviewWillAppear 方法中检查该变量是否SecondView 已打开和关闭。如果是,那么[self dismissModalViewControllerAnimated:true]

【讨论】:

-1 错误的架构选项。您正在创建 UIViewControllerAppDelegate 之间的依赖关系。当您进行开发时,您应该着眼长远,采用这种方法不利于松散耦合。 我的灵感来自您的解决方案,错误我不使用委托文件。实际上,我什至不知道它们是什么。【参考方案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];

【讨论】:

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

关闭表格视图控制器上方的模态显示视图控制器时,如何从表格视图控制器中取消选择行?

通过模态视图呈现详细视图控制器 [关闭]

关闭两个模态视图控制器

如何连续关闭两个模态视图控制器*动画*?

旋转设备时表格视图更新无效

在拆分视图中模态关闭 MWPhotoBrowser 视图控制器