在 View Dismissal 之前调用 Delegate 方法

Posted

技术标签:

【中文标题】在 View Dismissal 之前调用 Delegate 方法【英文标题】:Call Delegate Method Prior to View Dismissal 【发布时间】:2014-01-14 13:51:32 【问题描述】:

我有一个模态视图控制器,在我关闭它之前,我需要调用一个委托方法来告诉父视图控制器更新。 (因为在关闭模态视图控制器时不会调用像 viewWillAppear 这样的方法)。

所以我的代码如下所示:

[delegate addEquipmentDidSave:YES];
[self dismissViewControllerAnimated:YES completion:nil];

非常简单。回个消息说,马上更新!然后只是关闭视图。然而,虽然这两行都被调用,但委托方法永远不会运行。所以我检查它设置的委托是否正确。当我呈现模态视图时,我设置了委托,因此它全部连接。

就好像委托方法在视图被关闭之前没有机会运行一样。这可能吗?您认为可能是什么问题?

谢谢。

【问题讨论】:

你在运行代码时检查了委托设置了吗? 如果委托相关的事情没问题,只需尝试关闭委托方法内的视图。? @C_X 为什么?什么时候已经有可以在dismissal方法中使用的完成块了? @Abizern 完成块将在视图关闭后运行,并且 josh 希望它应该首先更新视图然后关闭其他模式视图。这就是为什么我说要测试其他一切是否正常。 没有看到addEquipmentDidSave的正文就不能准确地说,但我认为它没有更新,因为它在模态视图控制器的后台。 【参考方案1】:

在调用您的委托方法之前,首先检查它是否可用

if ([self.delegate respondsToSelector:@selector(addEquipmentDidSave:)] )

    NSLog("Yes it's available");
    [self.delegate addEquipmentDidSave:YES];


[self dismissViewControllerAnimated:YES completion:nil];

【讨论】:

我一直不知道如何使用respondsToSelector,导致我遇到了问题!原来我是从两个地方展示模态视图。导致只有一项设置正确。【参考方案2】:

你看到最后一个参数,叫做completion吗?在视图控制器关闭后调用该块。在那里做你想做的事。

【讨论】:

以上是关于在 View Dismissal 之前调用 Delegate 方法的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象编程第15篇 特殊方法之__del__

Python面向对象编程第15篇 特殊方法之__del__

为啥 __del__ 在 with 块的末尾被调用?

如何在操作系统检测到它之前或之后检测到 Ctrl-Alt-Del?

致命错误:调用未定义的方法 CookieComponent::del()

没有为指向结构的指针调用 ctypes.Structure 子类的 ctypes __del__