关闭模态视图控制器

Posted

技术标签:

【中文标题】关闭模态视图控制器【英文标题】:Dismissing Modal View Controller 【发布时间】:2012-08-16 08:45:49 【问题描述】:

我有一个根视图控制器,用作菜单。当一个项目被选中时,它会以模态方式呈现一些全屏数据。当点击返回按钮时,会执行以下代码:

在 BoardViewController.m 中:

 - (IBAction)menuButtonPressed:(id)sender
    
         [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
    

它很好地带回了主菜单。但在此之后,我想销毁被解雇的视图控制器(比如当你使用推送/弹出视图控制器时)。我不存储它们的任何引用,但它们在解雇后仍然存在。我该如何解决? (使用 ARC。)

编辑

在 AppDelegate.m 中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    ...
    MenuViewController *menuVC = [[MenuViewController alloc] init];
    self.window.rootViewController = menuVC;
    ...

在 MenuViewController.m 中:

- (IBAction)newGame:(id)sender
    
        BoardViewController *boardVC = [[BoardViewController alloc] init];
        boardVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self presentViewController:boardVC animated:YES completion:nil];
    

编辑 2

嗯,一个非弱委托属性导致了这个问题。谢谢大家!

【问题讨论】:

贴出你的代码……不只是这一部分,帮不上忙…… 要关闭当前视图吗? 不需要再创建实例,只要写dismiss view,它就会dismiss当前视图。 已解决。查看第二个编辑日志。 【参考方案1】:

我不使用 ARC,但如果模态控制器没有被释放,那么可能是因为其他东西仍然有对它的引用。模态控制器是否将自己作为委托添加到任何东西?

【讨论】:

我们同时找到了解决方案!你的答案是正确的!谢谢!【参考方案2】:

在代码中呈现 ModalViewController 应该如下所示:

- (void)showModal

    MyModalVC *mmvc = [[MyModalVC alloc] init];

    mmvc.dismissDelegate = self;

    UINavigationController *navController = [[UINavigationController alloc]
                                             initWithRootViewController:mmvc];

    navController.modalPresentationStyle = UIModalPresentationFormSheet; //or similar

    [self presentModalViewController:navController animated:YES];

    [cleaningTaskVC release]; //see that it is released after the presentation so that when you dismiss it you don't have to worry about the destruction of the object anymore
    [navController release];

最后的释放将确保销毁,这样你在关闭它时就不必担心它。

这就是我解除它的方式(使用我在 ModalVC 类中使用的协议和委托),然后没有活的 ModalVC 实例

- (void)didDismissModalView

    [self dismissModalViewControllerAnimated:YES];

希望这是你想要的。

祝你好运。

【讨论】:

我用的是ARC所以不是发布的问题。 那么这个答案对你没有用,在这种情况下我很抱歉。为了解除这个相同的 ModalViewController,我使用与下面的答案相同的方式。它对我有用,之后 MVC 就没有实例了。 ios 5.0 开始,我使用了一个名为presentingViewController 的属性,它实现了与您的dismissDelegate 相同的概念。这就是为什么我不明白我的代码有什么问题。但是,无论如何,谢谢。【参考方案3】:

试试这个,

- (IBAction)menuButtonPressed:(id)sender

   [self dismissModalViewControllerAnimated:YES];

【讨论】:

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

在后台关闭模态视图控制器

关闭模态视图控制器后呈现不同的视图控制器

一次关闭多个模态视图控制器?

从 uitabbarController 视图中关闭模态视图

关闭模态视图并调用初始视图控制器

关闭模态视图控制器后在根视图控制器中执行操作