Ios `UIViewController.present`正在立即调用完成处理程序
我使用的是Xcode 10 Beta 6,所以这可能只是一个bugIos `UIViewController.present`正在立即调用完成处理程序,ios,uiviewcontroller,completionhandler,uipopoverpresentationcontroller,Ios,Uiviewcontroller,Completionhandler,Uipopoverpresentationcontroller,我使用的是Xcode 10 Beta 6,所以这可能只是一个bug 我试图将视图控制器(colorPickerController)呈现为一个popover。在该视图控制器中,我将能够设置一些属性,一旦popover被解除,我就想读取这些属性 代码如下: 在第93…97行中,我定义了一个完成处理程序。 在第99行中,我以模态方式展示了colorPickerController,包括完成处理程序 运行代码时,颜色选择器控制器成功显示在弹出窗口中。但当我点击popover的外部(将其关闭)时,
我试图将视图控制器(
colorPickerController
)呈现为一个popover。在该视图控制器中,我将能够设置一些属性,一旦popover被解除,我就想读取这些属性
代码如下:
在第93…97行中,我定义了一个完成处理程序。在第99行中,我以模态方式展示了
colorPickerController
,包括完成处理程序
运行代码时,颜色选择器控制器成功显示在弹出窗口中。但当我点击popover的外部(将其关闭)时,没有调用回调 我想也许一个
UIPopoverPresentationController
不会“正常”关闭,所以我尝试在popover自己关闭之前手动关闭它,方法是在PopOverpresentationControllersoulddisMissPopOver
中调用Disclose
(第110行)
现在这仍然不起作用,所以我设置了一个断点,如图所示,以检查是否调用了委托方法。这时我注意到,在运行应用程序时,完成处理程序在弹出窗口出现时被正确调用,而不是在弹出窗口关闭时调用。
我在控制台中记录调用了
完成处理程序。
,甚至在到达断点之前
这怎么可能呢?@TylerTheCompiler是正确的,您通过的完成将在动画完成后运行。为了实现您的目标,我建议您: 1) 为UIViewController创建子类并创建自定义类型 2) 向类型的新类添加属性:
var functionToFinish: (() -> Void)
3) 将“更新颜色”的定义更改为:
let updateColor: (() -> Void) = ...
3a)为…插入函数的其余部分
4) 在第98行写:
colorPickerController.functionToFinish = updateColor
5) 现在,在子类控制器中,您可以从ViewDidDemouse事件调用该函数,就像您的代码在您的问题中一样,您的
updateColor
闭包仅在演示动画完成时被调用,而不是在您演示的视图控制器完成任何需要执行的操作时被调用
查看UIViewController.present(uquo;动画:完成:)的文档。
:
完成
演示文稿完成后要执行的块。此块没有返回值,也不接受任何参数。您可以为此参数指定nil
请注意“演示结束后”(重点是我的)。这意味着关闭将在从屏幕底部向上动画显示新视图控制器所需的0.2秒后立即执行(或者,如果您正在执行一些奇特的自定义显示动画,则无论需要多长时间以及以何种方式)
若要在新视图控制器完成任何需要执行的操作时获取回调,请使用子类
UIViewController
(例如调用它,ColorPickerViewController
),并使用某种委托通知当前视图控制器关闭颜色选择器视图控制器(大概是为了告诉它选择了什么颜色)。演示动画完成时调用updateColor,与解雇无关。@TylerTheCompiler如果您添加此作为答案,我会接受它。感谢您提供的详细信息和步骤,但当我执行步骤2时,Xcode会给我一个错误:“类AuthenticationController没有初始值设定项。”