UIViewControllers互相绊倒

时间:2010-03-25 20:59:06

标签: iphone cocoa-touch uiviewcontroller uinavigationcontroller

这里需要一些最佳实践建议......

基于导航的应用程序。根视图是一个UITableView,用户可以深入查看详细信息UIViewController(称之为VC1)。用户想要启动某项任务,但可能需要其他信息才能继续。如果是这样,则VC1分配&使用“翻转”转换呈现模态VC2,该转换在属性中保存对VC2的强引用。

所有相当标准。这是我遇到麻烦的地方。用户在VC2中填写所需信息后,应用可以继续转到MFMailComposeViewController或转回VC1。如果他们继续MailCompose然后当它解散它应该返回到VC1。

VC2对VC1的弱引用,当VC2试图解除自身并出现MFMailComposeViewController时,问题就出现了:

[self dismissModalViewControllerAnimated:YES];  
[VC1 performSelector:@selector(showMailModalView) withObject:nil afterDelay:0.2];

我在VC1上得到了一个EXC_BAD_ACCESS,因为很明显,我对VC1的弱引用已经被释放了,即使VC1强烈引用了VC2!?!

所以我的问题是......应该如何处理?代表模式会更好吗?怎么会被触发?

注意:VC1非常大并且通常不需要VC2,因此我试图尽可能将VC2与VC1(包括其自己的NIB)分开。

2 个答案:

答案 0 :(得分:1)

  

VC2对VC1有弱引用,当VC2尝试时问题就出现了   解雇自己并出席   MFMailComposeViewController:

你所拥有的是循环依赖,因为VC1知道VC2,然后你让VC2知道VC1。当你有循环依赖时,你会遇到各种各样的问题。

您应该在此处使用委托模式。当VC1呈现VC2时,它应该使自己成为VC2的委托。当VC2完成并想要解雇自己时,它应该让代表处理该操作。换句话说,显示VC2的东西应该是解散VC2的东西。 VC2应该以这样一种方式实现,即它不应该知道它呈现的是什么,只有它呈现它的东西将负责解雇它。

我最近给出了两个类似的答案:

Pop-up modal with UITableView on iPhone

call method in a subclass of UIView

答案 1 :(得分:0)

我遇到了同样的问题,我想回忆一下我是如何解决这个问题的。

您可以尝试致电:

[self.parentViewController dismissModalViewControllerAnimated:YES]

或者你可以让你的showMailModalView方法处理在显示邮件编辑器之前解雇当前的模态视图控制器吗?