Swift中Photo Library的ImagePicker打开选图延迟报错求助
Swift中Sheet唤起ImagePicker的延迟与错误解决方法
针对你遇到的Sheet唤起ImagePicker时的延迟、手势超时错误(<0x103107e90> Gesture: System gesture gate timed out),以及选图时的账户警告(Error returned from daemon: Error Domain=com.apple.accounts Code=7 "(null)"),可以尝试以下几个修复方案:
1. 替换过时的presentationMode为SwiftUI原生dismiss
旧的presentationMode在SwiftUI新版本中容易出现 Dismiss 冲突,改用环境变量dismiss更稳定:
修改你的ImagePicker代码:
struct ImagePicker: UIViewControllerRepresentable { @Binding var selectedImage: UIImage? @Environment(\.dismiss) var dismiss // 替换原来的presentationMode @Binding var choseImageFromCameraRoll: Bool class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate { let parent: ImagePicker init(parent: ImagePicker) { self.parent = parent } func imagePickerController( _ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any] ) { if let uiImage = info[.originalImage] as? UIImage { parent.selectedImage = uiImage parent.choseImageFromCameraRoll = true } parent.dismiss() // 直接调用dismiss } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { parent.choseImageFromCameraRoll = false parent.selectedImage = nil parent.dismiss() // 直接调用dismiss } } // 其余代码保持不变... }
2. 补充照片库写入权限
com.apple.accounts Code=7错误通常和照片库的写入权限缺失有关,即使你只需要读取,部分场景下也需要配置写入权限。在info.plist中添加:
- 键:
Privacy - Photo Library Additions Usage Description - 值:说明你的应用需要写入照片库的原因(比如"保存编辑后的图片到相册")
3. 调整ImagePicker的模态呈现样式
尝试给ImagePicker设置明确的模态样式,避免和Sheet的手势冲突:
在makeUIViewController方法中添加:
func makeUIViewController(context: Context) -> UIImagePickerController { let picker = UIImagePickerController() picker.delegate = context.coordinator picker.sourceType = .photoLibrary picker.modalPresentationStyle = .fullScreen // 或者.automatic,根据需求调整 return picker }
4. 避免状态重复触发检查
检查父视图中isImagePickerPresented的绑定是否存在重复赋值的情况,确保按钮点击时只触发一次状态变更:
Button { guard !videoChosen, !isImagePickerPresented else { return } // 增加额外判断,防止重复触发 isImagePickerPresented = true } label: { // 按钮UI保持不变... } .sheet(isPresented: $isImagePickerPresented) { ImagePicker(selectedImage: $selectedImage, choseImageFromCameraRoll: $choseImageFromCameraRoll) }
这些方案可以分别尝试,通常替换dismiss和补充权限就能解决大部分问题。
内容的提问来源于stack exchange,提问作者Karam Eid
相关产品推荐
相关产品推荐

