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

4

我知道这里有3-5个类似的问题,但是没有一个答案能解决我的问题。

我有一个视图控制器,它打开一个模态(table)view控制器,该控制器再次打开另一个控制器。两个模态控制器实际上都是表格视图控制器。我试图从第二个控制器中解除这两个控制器。我尝试了所有类似问题的已接受答案,但没有一个适用于我。

我尝试过

[self dismissModalViewControllerAnimated:true]

[self.parentViewController dismissModalViewControllerAnimated:true]
[self.parentViewController.parentViewController dismissModalViewControllerAnimated:true]

[self.presentingViewController dismissModalViewControllerAnimated:true]
[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:true]

当我尝试第二、三和五个选项时,什么都没有发生。当我使用选项1和4时,我看到模态视图动画被取消显示,并且底层视图本身会在一瞬间出现,然后一切都回到了第二个模态视图(这次没有动画)。
我开始认为这与我在模态视图中使用tableViewControllers有关。
顺便说一句,我是在didSelectRowAtIndexPath中关闭模态视图的。

你试过拨打4然后再拨打1吗? - Omar Abdelhafith
我刚刚尝试了你的建议,程序的行为与我单独使用这些选项时一样(我会简要返回到底层模态视图,然后立即回到最后一个视图)。 - Eedoh
https://dev59.com/HG445IYBdhLWcg3wQoEj - pie
@pie。从我原始的帖子中可以看出,我尝试了你所引用的帖子中提供的两个答案,但都没有解决我的问题。 - Eedoh
3个回答

2
尝试这个:当你关闭你的 SecondView 时,在 AppDelegate 文件中设置一个 BOOL 标志变量,并在 FirstView 的 viewWillAppear 方法中检查该变量,以确定 SecondView 是否已经打开并关闭。如果是,则使用 [self dismissModalViewControllerAnimated:true] 关闭 SecondView。

-1 错误的架构选项。您正在创建 UIViewControllerAppDelegate 之间的依赖关系。在开发时,您应该考虑长远,采用这种方法会违反松耦合的原则。 - Rui Peres
我受到了你的解决方案的启发,但我不使用委托文件。实际上,我甚至不知道它们是什么。 - Roger C S Wernersson

1

典型的模型视图控制器行为建议您从调用视图控制器而不是从自身解除模态视图控制器。这不是一条硬性规定,但是是一个好的实践。

要实现这一点,请创建一个协议:

    @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]
    }

0

由于我不使用委托文件,所以我做了以下操作:

FirstView中添加字段

BOOL mClose;

To FirstView add method

- (void)close
{
    mClose = YES;
}

在编程方面,将文本翻译成中文:在FirstView方法的viewDidAppear中添加。
if (mClose)
{
    [self dismissModalViewControllerAnimated:YES];
}

在打开SecondViewFirstView方法中添加。
[secondView closeWhenDone:self];

SecondView中添加字段

FirstView *mParent;

添加到 SecondView 的方法

- (void)closeWhenDone:(FirstView*)parent
{
    mParent = parent;
}

在关闭 SecondView 方法中添加以下内容。
[mParent close];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接