2

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


我正在尝试将视图控制器 ( colorPickerController) 呈现为弹出框。在该视图控制器中,我将能够设置一些属性,一旦弹出框被解除,我想读取这些属性。

这是代码:

代码

在第 93...97 行中,我定义了一个完成处理程序。
在第 99 行,我介绍了colorPickerController模态,包括完成处理程序。


运行代码时,颜色选择器控制器已成功显示在弹出窗口中。但是当我在弹出框之外点击(将其关闭)时,没有调用回调。

我想也许 aUIPopoverPresentationController不会“正常”关闭,所以我尝试手动关闭弹出框,然后它自己会这样做,方法是调用dismisspopoverPresentationControllerShouldDismissPopover第 110 行)。

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

这怎么可能?

4

2 回答 2

4

@TylerTheCompiler 是正确的,您通过的完成在动画完成后运行。为了完成你想要的,这是我推荐的:

1)子类化 UIViewController 并制作自定义类型。

2)向新的类型类添加一个属性:

var functionToFinish: (() -> Void)

3) 将更新颜色的定义更改为:

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

3a)插入你的功能的其余部分...

4)在第98行写:

colorPickerController.functionToFinish = updateColor

5) 现在,在子类控制器中,您可以从 viewDidDisappear 事件中调用该函数

于 2018-08-20T03:13:54.807 回答
4

你的代码在你的问题中的方式,你的updateColor闭包只在演示动画完成时被调用,而不是当你呈现的视图控制器完成它需要做的任何事情时。

请参阅文档UIViewController.present(_:animated:completion:)https ://developer.apple.com/documentation/uikit/uiviewcontroller/1621380-present

完成

演示结束后要执行的块。这个块没有返回值,也没有参数。您可以nil为此参数指定。

请注意“演示完成后”(强调我的)。这意味着闭包将在从屏幕底部向上动画显示新视图控制器所需的 0.2 秒时间后立即执行(或者,如果您正在做一些花哨的事情,无论需要多长时间和以任何方式)自定义演示动画)。

当你的新视图控制器完成它需要做的任何事情时,要获得回调,子类UIViewController(调用它,比如说,ColorPickerViewController),并使用某种委托来通知你当前的视图控制器关闭颜色选择器视图控制器(并且,大概是告诉它选择了什么颜色)。

于 2018-08-21T00:04:44.890 回答