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

调用UIImagePickerController时didFinishPickingMediaWithInfo不触发如何解决?

UIImagePickerController 代理方法不触发的原因及修复方案

常见触发原因

  • 未给UIImagePickerController实例绑定delegate
    初始化并准备弹出UIImagePickerController的代码中,忘记给实例设置delegate属性,系统就无法找到对应实现代理方法的类,自然不会回调。你需要在弹出选择器前添加代码:
    picker.delegate = self
    完整示例代码如下:
// 你弹出图片选择器的逻辑处
let imagePicker = UIImagePickerController()
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = true // 你代码中使用了editedImage,必须开启编辑属性
imagePicker.delegate = self // 缺失这行是最常见的原因
present(imagePicker, animated: true)
  • 缺少系统权限声明
    iOS系统要求访问相册、相机前必须在Info.plist中添加对应的权限描述,否则会导致选择器加载异常,代理方法不回调:
    • 访问相册需要添加NSPhotoLibraryUsageDescription,值为你向用户申请权限的说明文字
    • 调用相机需要添加NSCameraUsageDescription和NSMicrophoneUsageDescription(拍摄视频需要麦克风权限)
  • 方法签名不匹配
    如果你的Swift版本较低,使用了旧版本的方法签名(比如info参数的key为String类型而非UIImagePickerController.InfoKey枚举类型),会导致系统无法识别到你实现了对应的代理方法,你当前的方法签名是正确的,可排除该问题。

额外注意项

你当前代码中直接强制解包info[.editedImage],如果用户没有编辑图片或者你没有开启allowsEditing属性,会触发强制解包崩溃,建议修改为可选绑定:

guard let chosenImage = info[.editedImage] as? UIImage else {
    // 处理拿不到图片的情况,比如尝试取原始图
    guard let originalImage = info[.originalImage] as? UIImage else {
        dismiss(animated: true)
        return
    }
    imageChild.image = originalImage
    dismiss(animated: true)
    return
}
imageChild.image = chosenImage
dismiss(animated: true)

内容的提问来源于stack exchange,提问作者Kavya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:27:03