0

这里需要一些最佳实践建议...UIViewControllers彼此绊倒

基于导航的应用程序。根视图是一个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]; 

我得到一个EXC_BAD_ACCESS上VC1,因为,很显然,我的弱引用VC1已是即使VC1对VC2有很强的参考,也可以解除分配!

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

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

回答

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

0

我遇到了同样的问题,我试图回想我如何修复它。

你可以尝试致电:

[self.parentViewController dismissModalViewControllerAnimated:YES] 

或者你可以有你的showMailModalView方法处理驳回显示邮件撰写之前,在当前模态视图控制器?