Swift:防止 ABPeoplePickerNavigationController 关闭

Posted

技术标签:

【中文标题】Swift:防止 ABPeoplePickerNavigationController 关闭【英文标题】:Swift: Prevent ABPeoplePickerNavigationController from Closing 【发布时间】:2015-08-21 21:56:03 【问题描述】:

我想找到一种方法,如果用户在ABPeoplePickerNavigationController 中按下“取消”按钮(我不相信可以将其删除),视图控制器要么不会关闭,或将自动重新打开。

例如,给定以下内容:

var picker = ABPeoplePickerNavigationController()
picker.peoplePickerDelegate = self
self.presentViewController(picker, animated: true, completion: nil)

我希望能够做类似的事情:

if (self.presentedViewController != picker && !userContinuedPastPicker) 
//where userContinuedPastPicker is a boolean set to false 
//in a delegate method called when the user clicks on an a contact 
//(meaning the user didn't press the cancel button but instead clicked on a contact)

    //create and present a UIAlertAction informing the user they must select a contact

    //present picker again
    self.presentViewController(picker, animated: true, completion: nil) 

这不起作用;但是,因为if 语句在用户按下取消按钮或按下联系人之前不会“等待”。

【问题讨论】:

【参考方案1】:

我不确定是否有办法移除取消按钮或阻止其工作,但您可以回复func peoplePickerNavigationControllerDidCancel(_ peoplePicker: ABPeoplePickerNavigationController!) 代表来处理按下取消按钮的情况。

我建议不要立即重新打开选择器,而是打开一个警报,告诉用户他们需要选择某人,然后从那里重新打开它。如果他们取消并立即重新打开,它可能会感到破碎。

Reference

编辑: 显示警报或选择器可能需要延迟足够长的时间才能关闭前一个选择器。 dispatch_after

【讨论】:

这似乎正是我所需要的!但是,当我尝试呈现 ABPPNCUIAlertController 的另一个实例时(正如您明智地建议的那样),我收到一条错误消息:Warning: Attempt to present <UIAlertController: 0x7a0cfc50> on <App.FirstViewController: 0x7a06dd30> whose view is not in the window hierarchy! 我的猜测是,当人物选择器在屏幕上显示动画时,您正在呈现警报。尝试在 dispatch_after ***.com/questions/24034544/… 中为警报包装 presentViewController

以上是关于Swift:防止 ABPeoplePickerNavigationController 关闭的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 在 UIViewController 中防止返回事件

Swift 防止 NSKeyedUnarchiver.decodeObject 崩溃的唯一方法?

swift 防止屏幕锁定应用

Swift 防止 TabBar 在键盘处于活动状态时向上移动

如何防止 Swift 4 重叠或独占访问错误?

我可以防止将扩展导出到 Objective-C 的 Swift 标头吗?