如何在Popover中关闭UIImagePickerController?附视图层级与代码
如何在你的Popover场景中关闭UIImagePickerController
嘿,针对你这个特殊的视图层级(A -> Popover Segue -> 导航控制器 -> B -> UIImagePickerController)加上你给picker设置的特殊属性,我来给你讲清楚怎么正确关闭它:
首先得明确你的关键设置:你给picker加了modalPresentationStyle = .currentContext和isModalInPopover = true,这两个设置会影响dismiss的逻辑——.currentContext意味着picker是在视图控制器B的上下文里被present的,所以不能直接让picker自己dismiss,得让它的presentingViewController(也就是B)来处理。
方法一:在picker的代理方法中关闭
这是最常用的场景,不管用户是取消选择还是完成选择,都可以在对应的代理方法里处理:
// 用户取消选择时的代理方法 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { // 让视图控制器B来dismiss picker self.dismiss(animated: true, completion: nil) // 或者也可以通过picker的presentingViewController调用,效果完全一致: // picker.presentingViewController?.dismiss(animated: true, completion: nil) } // 用户完成媒体选择后的代理方法 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { // 先处理你选中的视频内容,比如获取视频URL if let videoURL = info[.mediaURL] as? URL { // 这里写你的视频处理逻辑 } // 同样的方式关闭picker self.dismiss(animated: true, completion: nil) }
方法二:在视图控制器B的其他逻辑中关闭(比如自定义按钮点击)
如果你需要在B里的其他地方(比如一个自定义的关闭按钮)关闭picker,只要你持有picker的引用,就可以这样做:
// 假设你在B类里声明了picker属性:var picker: UIImagePickerController? @IBAction func manualClosePickerTapped(_ sender: UIButton) { // 让B自己发起dismiss操作 self.dismiss(animated: true, completion: nil) // 或者通过picker的presentingViewController调用也可以: // picker?.presentingViewController?.dismiss(animated: true, completion: nil) }
需要避开的坑
- 不要直接调用
picker?.dismiss(animated: true, completion: nil),在.currentContext的展示模式下,picker的dismiss必须由它的presentingViewController发起,直接让picker自己dismiss可能会导致popover状态异常,甚至无法正确关闭。 isModalInPopover = true只是让picker在popover内保持模态状态,禁止背后的视图响应交互,不会影响dismiss的核心逻辑,所以不用因为这个设置调整关闭方式。
内容的提问来源于stack exchange,提问作者RGold
相关产品推荐
相关产品推荐

