Xcode12中UIImagePickerController代理didFinishPickingMediaWithInfo未触发
问题分析与解决方案
这问题我之前踩过一模一样的坑!核心原因是ARC自动引用计数机制下,你的ImagePicker对象被提前释放了,导致代理方法根本找不到响应的对象。
为什么断点时能正常工作?
当你加断点暂停程序时,ImagePicker对象的生命周期被人为拉长了(程序暂停期间ARC不会触发释放逻辑),所以代理还能正常接收回调;一旦移除断点,程序正常运行时,如果ImagePicker是局部变量,方法执行完毕后就会被ARC立即回收,此时UIImagePickerController的代理已经变成nil,自然不会触发didFinishPickingMediaWithInfo方法。
推测你的调用场景
你大概率是在ViewController的某个方法里创建了局部的ImagePicker实例,类似这样:
func openImagePicker() { let picker = ImagePicker() picker.present(presentationController: self) { pickedImage in // 处理选中的图片 } }
这里的picker是局部变量,方法执行完就会被ARC释放,后续图片选择完成时,根本找不到代理对象来触发回调。
解决方案:延长ImagePicker的生命周期
把ImagePicker声明为调用它的ViewController的属性,让VC持有它,直到图片选择流程结束后再手动释放:
- 在你的ViewController中添加属性:
// 用可选类型,方便用完后置空释放 private var imagePicker: ImagePicker?
- 修改调用代码:
func openImagePicker() { imagePicker = ImagePicker() imagePicker?.apiKey = "你的API密钥" imagePicker?.present(presentationController: self) { [weak self] pickedImage in // 处理选中的图片逻辑 if let selectedImage = pickedImage.image { // 比如显示图片、上传等操作 } // 流程结束后置空,释放ImagePicker对象 self?.imagePicker = nil } }
额外验证点
你代码里的pickerController.delegate = self设置是没问题的,只要self(也就是ImagePicker实例)还活着,代理就能正常响应。Xcode12之后ARC的优化可能更严格,之前Xcode11下可能因为某些延迟释放的巧合没暴露这个问题,现在就显现出来了。
内容的提问来源于stack exchange,提问作者Kathiresan Murugan
相关产品推荐
相关产品推荐

