关闭模态视图控制器
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];
【讨论】:
以上是关于关闭模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章