【问题标题】:Why does my UIImageView replace the second one?为什么我的 UIImageView 替换了第二个?
【发布时间】:2017-12-03 20:18:22
【问题描述】:

我有两个用于两个不同 UIImageView 的插座,当我选择第一个时,它会出现在第一个 Image View 上,但是当我选择第二个 Image 时,即使它连接到第二个 ImageView,它也会替换第一个 Image View。这是我的“选择图像”按钮的代码。

@IBOutlet weak var myImageView1: UIImageView!
@IBOutlet weak var myImageView2: UIImageView!


@IBAction func pickImage1(_ sender: Any) {

    let image = UIImagePickerController()
    image.delegate = self
    image.sourceType = UIImagePickerControllerSourceType.photoLibrary
    image.allowsEditing = false

    self.present(image, animated: true)
}

//Add didFinishPickingMediaWithInfo here
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        myImageView1.image = image
    }
    else {
        //error
    }
    self.dismiss(animated: true, completion: nil)
}


@IBAction func pickImage2(_ sender: Any) {
    let image2 = UIImagePickerController()
    image2.delegate = self
    image2.sourceType = UIImagePickerControllerSourceType.photoLibrary
    image2.allowsEditing = false

    self.present(image2, animated: true)
}

//Add didFinishPickingMediaWithInfo here
func imagePickerController2(_ picker2: UIImagePickerController, didFinishPickingMediaWithInfo2 info2: [String : Any]) {
    if let image2 = info2[UIImagePickerControllerOriginalImage] as? UIImage {
        myImageView2.image = image2
    }
    else {
        //error
    }
    self.dismiss(animated: true, completion: nil)

}

【问题讨论】:

  • 如果您重命名委托方法,就像您在第二次调用中所做的那样,它将不再被识别或调用。
  • @BJHStudios 您对问题原因的解释应该在您的回答中。
  • @rmaddy 完成,谢谢。

标签: ios swift swift3 uiimageview imageview


【解决方案1】:

试试这个代码。所以你需要一个标志来记住点击了哪个图像视图,然后根据它设置图像。

var selected = 1

@IBAction func pickImage1(_ sender: Any) {

    let image = UIImagePickerController()
    image.delegate = self
    image.sourceType = UIImagePickerControllerSourceType.photoLibrary
    image.allowsEditing = false
    selected = 1

    self.present(image, animated: true)
}

//Add didFinishPickingMediaWithInfo here
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        if selected == 1 {
            myImageView1.image = image
        } else {
            myImageView2.image = image
        }
    }
    else {
        //error
    }
    self.dismiss(animated: true, completion: nil)
}


@IBAction func pickImage2(_ sender: Any) {
    let image2 = UIImagePickerController()
    image2.delegate = self
    image2.sourceType = UIImagePickerControllerSourceType.photoLibrary
    image2.allowsEditing = false
    selected = 2

    self.present(image2, animated: true)
}

向前看,当您有多个图像视图时,您可以使用另一种方法来避免到处复制代码。

首先,为每个图像视图添加一个唯一标签。避免使用 0,因为默认标签是 0。因此您将看到带有标签的图像视图,例如 1 到 4。

对所有图像视图调用相同的方法,以便通过单击其中任何一个来触发此功能

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
imageView.addGestureRecognizer(tapGestureRecognizer)

处理程序看起来像这样

func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    let image = UIImagePickerController()
    image.delegate = self
    image.sourceType = UIImagePickerControllerSourceType.photoLibrary
    image.allowsEditing = false
    let tappedImage = tapGestureRecognizer.view as! UIImageView
    selected = tappedImage.tag
    self.present(image, animated: true)
}

终于在图片挑选委托中

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        if let imageView = self.view.viewWithTag(selected) as? UIImageView {
            imageView.image = image
        }
    }
    else {
        //error
    }
    self.dismiss(animated: true, completion: nil)
}

【讨论】:

  • 虽然这是一个正确的解决方案,但为了使这个答案更好,请在 OP 的代码中解释问题。
  • 与其将selected 属性添加为Int,不如添加var selectedImageView: UIImageView? 属性。在两个 pickImageX 方法中设置它。然后在delegate中,直接将选中的图片赋值给属性。不需要if
  • 嘿,如果我想添加额外的图像,如 3 或 4,我该怎么办?
  • @Riccardo 更新
【解决方案2】:

问题是您重命名了委托方法。如果你这样做,该方法将不会被识别或调用。

所选答案的另一个选项是扩展 UIImageView 并使其遵守 UIImagePickerControllerDelegate / UINavigationControllerDelegate

extension UIImageView: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

     public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
          guard let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage else {
             //handle error
             return
         }

         image = selectedImage
         picker.presentingViewController?.dismiss(animated: true)
     }

     func presentImagePicker(from viewController: UIViewController) {
         let picker = UIImagePickerController()
         picker.delegate = self
         picker.sourceType = .photoLibrary
         picker.allowsEditing = false

         viewController.present(picker, animated: true)
     }
}

这很好,因为您可以使用一行代码为您的应用中的任何UIImageView 启动图像选择器,如下所示:

@IBAction func pickImage1(_ sender: UIButton) {
    myImageView1.presentImagePicker(from: self)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-31
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多