You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:32:42