【问题标题】:UIViewControllers tripping over each otherUIViewControllers 相互绊倒
【发布时间】:2011-01-31 22:28:34
【问题描述】:

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

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

【问题讨论】:

    标签: iphone cocoa-touch uiviewcontroller uinavigationcontroller


    【解决方案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

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我正在尝试回忆我是如何解决的。

      您可以尝试调用:

      [self.parentViewController dismissModalViewControllerAnimated:YES]
      

      或者您能否让您的 showMailModalView 方法处理在显示邮件编写器之前解除当前模式视图控制器?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-30
        相关资源
        最近更新 更多