我正在使用Xcode 10 Beta 6,所以这可能只是一个错误。
我正在尝试将视图控制器(colorPickerController
)呈现为弹出框。在该视图控制器中,我将能够设置一些属性,一旦关闭弹出窗口,我将要读取这些属性。
代码如下:
在93 ... 97行中,我定义了完成处理程序。
在第99行中,我以模态形式显示colorPickerController
,包括完成处理程序。
运行代码时,颜色选择器控制器已成功显示在弹出窗口中。但是,当我在弹出窗口之外点击(以将其关闭)时,未调用该回调。
我以为也许UIPopoverPresentationController
不会“正常”关闭,所以我尝试通过手动{@ {1}}中的dismiss
来手动消除弹出窗口(第110行) 。
现在这仍然不起作用,因此我如图中所示设置了一个断点,以检查委托方法是否被调用。
那是我注意到的,当运行该应用程序时,完成处理程序将在弹出窗口出现时立即调用,而不是在关闭时被调用。
我甚至在到达断点之前都在控制台中记录popoverPresentationControllerShouldDismissPopover
。
这怎么可能?
答案 0 :(得分:2)
代码出现问题的方式,updateColor
闭包仅在 presentation 动画完成时被调用,而不是在您呈现的视图控制器完成所需的操作时调用要做。
请参阅UIViewController.present(_:animated:completion:)
的文档:
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621380-present
完成
演示完成后要执行的代码 。该块没有返回值,并且不带参数。您可以为此参数指定
nil
。
请注意“演示结束后”(强调我的意思)。这意味着关闭将在屏幕底部从头开始为新视图控制器呈现动画的0.2秒后立即执行(或者需要花费很长时间,并且如果您花哨的话也可以以任何方式)自定义演示动画)。
要获取新视图控制器何时完成其所需做的工作的回调,请子类UIViewController
(称为ColorPickerViewController
),并使用某种委托来通知您当前的视图控制器以关闭颜色选择器视图控制器(并大概告诉它选择了哪种颜色)。
答案 1 :(得分:0)
@TylerTheCompiler是正确的,您通过的完成将在动画完成后运行。为了完成您想要的,这是我的建议:
1)子类化UIViewController并创建自定义类型。
2)向新类型的类添加属性:
var functionToFinish: (() -> Void)
3)将更新颜色的定义更改为:
let updateColor: (() -> Void) = ...
3a)将其余功能插入...
4)在第98行上输入:
colorPickerController.functionToFinish = updateColor
5)现在,在子类控制器中,您可以从viewDidDisappear事件中调用该函数