【问题标题】:How to properly dismiss modal viewcontroller with completion handler如何使用完成处理程序正确关闭模态视图控制器
【发布时间】:2025-12-06 08:10:01
【问题描述】:

我有viewController1viewController2,它们是模态的,当我解雇第二个时我想使用完成处理程序,但我无法实现。我认为我必须编写一个函数并将其放在那里:

viewController.dismissViewControllerAnimated(true, completion: funcToCall())

然后我得到这个错误:

无法将类型“()”的值转换为预期的参数类型“(() -> 无效)?'

谁能解释一下,请问如何正确执行完成处理程序?

【问题讨论】:

    标签: ios swift uiviewcontroller


    【解决方案1】:

    很简单,将funcToCall() 作为completion 参数传递(重要说明 - 我在这里使用花括号):

    viewController.dismissViewControllerAnimated(true, completion: { 
        funcToCall()
    })
    

    一份completion参数文档:

    视图控制器关闭后要执行的块。这个块没有返回值,也没有参数。您可以为此参数指定 nil。

    【讨论】:

    • 那么问题是我没有使用大括号吗?但是,它有效,但似乎只是部分。当我尝试呈现一个新的 viewController 时,我仍然收到此错误:尝试呈现其视图不在窗口层次结构中的 viewController3!但后来它以某种方式呈现它。它让我发疯
    • 我会尽力解释得更好。我正在以完成方式解除 vc2:vc1 中的通知和观察者在 vc2 应该被解除时触发 segueWithIdentifier,但随后我得到“尝试呈现其视图不在窗口层次结构中的 viewController3!”错误。现在我仍然得到它,但随后 segue 被执行,我不确定这是否会带来未来的问题。
    • 哦,这又是一个错误。请检查此线程 - *.com/questions/26022756/…
    • 我认为问题出现是因为 vc2 没有完全消除。
    • 我不确定 *.com/questions/26022756/… 是否适用于这个问题,因为当我改变呈现 VC 的方式时,即模态呈现,我收到以下警告消息:“警告: 在演示过程中尝试在 vc1 上演示 vc3!"我应该发布一个新问题来解释这个问题吗?编辑:这就是为什么我认为问题是当 vc3 出现时 vc2 仍然处于活动状态
    【解决方案2】:

    只需删除括号并将函数名称作为参数传递,如下所示:

    viewController.dismissViewControllerAnimated(true, completion: funcToCall)
    

    只要你的函数 funcToCalltype ()->Void 就像这样,它就可以工作

    func funcToCall() {  
        // do something
    }
    

    【讨论】:

      最近更新 更多