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

Swift中如何通过三个按钮分别选择三张不同图片并赋值到对应UIImageView

问题原因与解决方案

问题根源

你当前的EasyImagePickerDelegate回调方法没有区分触发选择操作的是哪一个图片选择器实例,只要有图片返回,就会同时给三个图片视图执行赋值操作,所以才会出现任选一张图三个视图同时更新的问题。

可选解决方案

方案1:新增临时变量记录目标视图(无需修改自定义Picker代码,改造成本最低)

  1. 先在控制器中新增属性记录当前要赋值的目标图片视图
class EditProfileImagesVC: UIViewController {
    // 新增属性
    private var currentTargetImageView: UIImageView?
    // 原有其他属性保持不变
    private var imagePicker : EasyImagePicker?
    private var imagePicker1 : EasyImagePicker?
    private var imagePicker2 : EasyImagePicker?
    
    @IBOutlet weak var profilePicImage: UIImageView!
    @IBOutlet weak var leftProfilePicImg: UIImageView!
    @IBOutlet weak var rightProfilePicImg: UIImageView!

    // 原有viewDidLoad保持不变
    override func viewDidLoad() {
        super.viewDidLoad()
        imagePicker = EasyImagePicker(presentationController: self, delegate: self)
        imagePicker1 = EasyImagePicker(presentationController: self, delegate: self)
        imagePicker2 = EasyImagePicker(presentationController: self, delegate: self)
    }
  1. 修改按钮点击方法,点击时先记录目标视图
@IBAction func profilePicBtn(_ sender: UIButton) {
        currentTargetImageView = profilePicImage
        imagePicker?.present(from: sender, mediaType: .images, onViewController: self)
    }
    
    @IBAction func leftProfileBtn(_ sender: UIButton) {
        currentTargetImageView = leftProfilePicImg
        imagePicker1?.present(from: sender, mediaType: .images, onViewController: self)
    }
    
    @IBAction func rightProfileBtn(_ sender: UIButton) {
        currentTargetImageView = rightProfilePicImg
        imagePicker2?.present(from: sender, mediaType: .images, onViewController: self)
    }
}
  1. 重写回调方法,仅给记录的目标视图赋值
extension EditProfileImagesVC : EasyImagePickerDelegate{
    func didSelect(image: UIImage?, video: URL?, fileName: String?) {
        guard let image = image else { return }
        currentTargetImageView?.image = image
        // 赋值完成后置空,避免意外复用
        currentTargetImageView = nil
    }
}

方案2:修改Picker的代理协议,回传当前触发的Picker实例(可扩展性更好)

  1. 先修改EasyImagePickerDelegate协议定义,给回调方法增加picker参数
protocol EasyImagePickerDelegate: AnyObject {
    func didSelect(picker: EasyImagePicker, image: UIImage?, video: URL?, fileName: String?)
}
  1. 在EasyImagePicker内部触发代理回调时,将自身实例作为参数传入
  2. 修改控制器的回调实现,根据Picker实例判断赋值目标
extension EditProfileImagesVC : EasyImagePickerDelegate{
    func didSelect(picker: EasyImagePicker, image: UIImage?, video: URL?, fileName: String?) {
        guard let image = image else { return }
        // 用===判断实例身份
        switch picker {
        case imagePicker:
            profilePicImage.image = image
        case imagePicker1:
            leftProfilePicImg.image = image
        case imagePicker2:
            rightProfilePicImg.image = image
        default: break
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:18:03