当我点击两个不同的UIImageViews并选择后,将它们显示在两个不同的UIImageView上,我想从手机库中选择图像,但是我在运行以下代码时,同一张图片显示在两个不同的UIImageViews上,如何解决?'''
extension SettingProfileViewController:UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
profilePhoto.image = image
print("profile")
}
if let wallImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
wallpaperPhoto.image = wallImage
print("wallpaper")
}
dismiss(animated: true, completion: nil)
}
}
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(SettingProfileViewController.handleSelectProfilePhotoView))
profilePhoto.addGestureRecognizer(tapGesture)
profilePhoto.isUserInteractionEnabled = true
let wallTapGesture = UITapGestureRecognizer(target: self, action: #selector(SettingProfileViewController.handleSelectWallpaperImageView))
wallpaperPhoto.addGestureRecognizer(wallTapGesture)
wallpaperPhoto.isUserInteractionEnabled = true
}
@objc func handleSelectProfilePhotoView(){
let pickerController = UIImagePickerController() //открывает галерею
pickerController.delegate = self
present(pickerController, animated: true, completion: nil)
}
@objc func handleSelectWallpaperImageView(){
let pickerCont = UIImagePickerController()
pickerCont.delegate = self
present(pickerCont, animated: true, completion: nil)
}
'''
您观察到的是,当用户点击任意图像视图(wallpaperPhoto
或profilePhoto
)时,UIImagePickerController
始终使用self
作为其委托。然后,当用户选择图像时,委托者无法再区分最初点击的图像视图。
您可以简单地添加一个弱的可选变量,以指示点击的“活动”图像视图,然后仅设置其图像。另外,您还可以使用sender参数将点击处理程序简化为单个函数,该参数是用户点击的图像视图,并将activeImageView
设置为此。
extension SettingProfileViewController:UIImagePickerControllerDelegate, UINavigationControllerDelegate {
weak var activeImageView:UIImageView? = nil
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
activeImageView.image = image
}
dismiss(animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(SettingProfileViewController.handleSelect(_:))
profilePhoto.addGestureRecognizer(tapGesture)
profilePhoto.isUserInteractionEnabled = true
let wallTapGesture = UITapGestureRecognizer(target: self, action: #selector(SettingProfileViewController.handleSelect(_:)))
wallpaperPhoto.addGestureRecognizer(wallTapGesture)
wallpaperPhoto.isUserInteractionEnabled = true
}
@objc func handleSelect(sender:UIGestureRecognizer) {
guard let sendingImageView = sender.view as? UIImageView else {
print("Ooops, received this gesture not from an ImageView")
return
}
activeImageView = sendingImageView
let pickerController = UIImagePickerController() //открывает галерею
pickerController.delegate = self
present(pickerController, animated: true, completion: nil)
}
// ...