代码之家  ›  专栏  ›  技术社区  ›  Marcus Rossel

`UIViewController.present`正在立即调用完成处理程序

  •  0
  • Marcus Rossel  · 技术社区  · 6 年前

    我正在使用Xcode 10 Beta 6,所以这可能只是一个bug。


    我正在演示一个视图控制器( colorPickerController )作为一个教皇。在这个视图控制器中,我可以设置一些属性,一旦弹出窗口被解除,我想读取这些属性。

    代码如下:

    Code

    在第93…97行中,我定义了一个完成处理程序。
    在第99行中,我展示了 在模式上,包括完成处理程序。


    运行代码时,颜色选择器控制器已成功显示在弹出窗口中。但当我在popover之外点击(解除它)时,没有调用回调。

    我想也许 UIPopoverPresentationController 不解除“正常”,所以我尝试在弹出窗口自行解除之前手动解除它,方法是调用 dismiss 在里面 popoverPresentationControllerShouldDismissPopover

    现在这仍然不起作用,所以我设置了一个如图所示的断点,以检查委托方法是否被调用。
    我注意到,在运行应用程序时,完成处理程序在弹出窗口出现时调用,而不是在它关闭时调用。
    我在记录 Completion handler was called.

    这怎么可能?

    2 回复  |  直到 6 年前
        1
  •  3
  •   TylerP    6 年前

    你的代码在你的问题中,你的 updateColor 只有当 演示 动画完成,而不是当你呈现的视图控制器完成了它需要做的任何事情。

    UIViewController.present(_:animated:completion:) : https://developer.apple.com/documentation/uikit/uiviewcontroller/1621380-present

    完成

    演示结束后 . 此块没有返回值,不接受任何参数。您可以指定 nil

    注意“演示结束后”(强调我的)。这意味着闭包将在从屏幕底部向上显示新视图控制器所需的0.2秒时间之后执行(或者,如果您正在执行一些奇特的自定义演示动画,则无论需要多长时间和以何种方式)。

    若要在新视图控制器完成所需操作时获取回调,请子类 UIViewController (比如说, ColorPickerViewController ),并使用某种类型的委托通知当前视图控制器关闭颜色选择器视图控制器(并可能告诉它选择了什么颜色)。

        2
  •  1
  •   binaryPilot84    6 年前

    1) 子类化UIViewController并创建自定义类型。

    2) 将属性添加到类型为的新类:

    var functionToFinish: (() -> Void)
    

    let updateColor: (() -> Void) = ...
    

    3a)插入您的函数的其余部分。。。

    4) 第98行写:

    colorPickerController.functionToFinish = updateColor