Swift中如何通过三个按钮分别选择三张不同图片并赋值到对应UIImageView
问题原因与解决方案
问题根源
你当前的EasyImagePickerDelegate回调方法没有区分触发选择操作的是哪一个图片选择器实例,只要有图片返回,就会同时给三个图片视图执行赋值操作,所以才会出现任选一张图三个视图同时更新的问题。
可选解决方案
方案1:新增临时变量记录目标视图(无需修改自定义Picker代码,改造成本最低)
- 先在控制器中新增属性记录当前要赋值的目标图片视图
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) }
- 修改按钮点击方法,点击时先记录目标视图
@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) } }
- 重写回调方法,仅给记录的目标视图赋值
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实例(可扩展性更好)
- 先修改
EasyImagePickerDelegate协议定义,给回调方法增加picker参数
protocol EasyImagePickerDelegate: AnyObject { func didSelect(picker: EasyImagePicker, image: UIImage?, video: URL?, fileName: String?) }
- 在
EasyImagePicker内部触发代理回调时,将自身实例作为参数传入 - 修改控制器的回调实现,根据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
相关产品推荐
相关产品推荐

