Swift 4中ImagePickerViewController调用代理方法时遇PlugInKit Code=13错误
解决ImagePickerViewController "query cancelled" (Code=13) 错误
嘿,这个错误我之前踩过坑,大概率是几个常见的小问题导致的,咱们来一步步排查解决:
1. 别忘了在代理方法中关闭ImagePicker控制器
你的代理方法代码里没看到dismiss操作!这是最容易忽略的点——当用户选择完图片后,必须手动关闭UIImagePickerViewController,否则系统可能会判定操作未完成,抛出"query cancelled"错误。修改你的代码:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { if let imageData = UIImagePNGRepresentation(image) { UserDefaults.standard.set(imageData, forKey: "avatarImage") } } else { // 处理图片获取失败的情况 print("无法获取选中的图片") } // 关键:必须关闭选择器 picker.dismiss(animated: true, completion: nil) }
另外,也要确保你实现了取消代理方法,同样要关闭控制器:
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) }
2. 检查相册/相机权限配置
iOS 10+ 要求访问相册或相机必须在Info.plist中添加权限描述,否则系统会直接拒绝访问,触发类似的错误。
- 访问相册:添加
NSPhotoLibraryUsageDescription键,值填用户能理解的权限说明(比如"需要访问相册来选择头像") - 访问相机:如果你的ImagePicker支持相机,还要添加
NSCameraUsageDescription键和对应的描述
添加方法:右键项目中的Info.plist → Add Row → 选择对应的权限键,填写描述文本。
3. 替换过时的字符串键(Swift 4+ 最佳实践)
Swift 4开始,UIImagePickerController的info字典推荐使用UIImagePickerController.InfoKey枚举而不是字符串键,这样更安全,避免拼写错误。修改你的图片获取代码:
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { // 后续逻辑不变 }
4. 检查ImagePicker的初始化配置
确保你正确设置了sourceType和delegate:
let imagePicker = UIImagePickerController() imagePicker.sourceType = .photoLibrary // 或者.camera,根据你的需求 imagePicker.delegate = self present(imagePicker, animated: true, completion: nil)
如果设置了.camera,还要检查设备是否有相机(比如模拟器默认没有相机,会直接触发错误),可以提前判断:
if UIImagePickerController.isSourceTypeAvailable(.camera) { imagePicker.sourceType = .camera } else { imagePicker.sourceType = .photoLibrary print("当前设备不支持相机") }
按照这几个步骤排查,应该就能解决这个"query cancelled"的错误了!
内容的提问来源于stack exchange,提问作者Golden Mamba
相关产品推荐
相关产品推荐

