Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios `UIViewController.present`正在立即调用完成处理程序_Ios_Uiviewcontroller_Completionhandler_Uipopoverpresentationcontroller - Fatal编程技术网

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

Ios `UIViewController.present`正在立即调用完成处理程序,ios,uiviewcontroller,completionhandler,uipopoverpresentationcontroller,Ios,Uiviewcontroller,Completionhandler,Uipopoverpresentationcontroller,我使用的是Xcode 10 Beta 6,所以这可能只是一个bug 我试图将视图控制器(colorPickerController)呈现为一个popover。在该视图控制器中,我将能够设置一些属性,一旦popover被解除,我就想读取这些属性 代码如下: 在第93…97行中,我定义了一个完成处理程序。 在第99行中,我以模态方式展示了colorPickerController,包括完成处理程序 运行代码时,颜色选择器控制器成功显示在弹出窗口中。但当我点击popover的外部(将其关闭)时,

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


我试图将视图控制器(
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没有初始值设定项。”