如何以相同的方法使用不同的按钮来获得不同的结果?

How to use different buttons with a same method for different results?

我有一个由四张不同图片组成的正方形,两张在顶部,两张在底部,要在从图片库加载后显示。

每个图像视图都与其个人按钮相关联,这将使用与进入用户库以获取图像相同的方法。

如何使用相同的方法使用四个不同的按钮将加载的图像显示在适当的位置?

我可以制作一个模型来执行此行为吗?

谢谢

@IBOutlet weak var topLeftImage: UIImageView!
@IBOutlet weak var topRightImage: UIImageView!
@IBOutlet weak var bottomLeftImage: UIImageView!
@IBOutlet weak var bottomRightImage: UIImageView!

@IBOutlet weak var topLeftButton: UIButton!
@IBOutlet weak var topRightButtom: UIButton!
@IBOutlet weak var bottomLeftButton: UIButton!
@IBOutlet weak var bottomRightButton: UIButton!

@IBAction func loadTopLeftImage(_ sender: Any) {
    loadPhotoLibrary()
}

@IBAction func loadTopRightImage(_ sender: Any) {
    loadPhotoLibrary()
}

@IBAction func loadBottomLeftImage(_ sender: Any) {
    loadPhotoLibrary()
}

@IBAction func loadBottomRightImage(_ sender: Any) {
    loadPhotoLibrary()
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {


        topLeftImage.image = image

    }
    self.dismiss(animated: true, completion: nil)
}


func loadPhotoLibrary() {

        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
        imagePicker.allowsEditing = false

        self.present(imagePicker, animated: true)
}

首先创建UIImagePickerController的子类并添加参数类型为UIImage?

的变量completionHandler
class YourPicker: UIImagePickerController {
    var completionHandler: ((UIImage?) -> ())?
}

然后将参数添加到您的 loadPhotoLibrary 函数,它将代表 UIImageView 您想要更改其 image。还要设置它的完成处理程序:你想更改某些 ImageView

image
func loadPhotoLibrary(setImageView imageView: UIImageView) {

    let imagePicker = YourPicker() // don't forget to initialize subclass

    imagePicker.delegate = self
    imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
    imagePicker.allowsEditing = false

    imagePicker.completionHandler = { image in
        if let image = image { // if you just dismiss picker, you don't want to delete previous image
            imageView.image = image
        }
    }

    self.present(imagePicker, animated: true)
}

现在在选择器的委托方法中将 picker 向下转换为 YourPicker 并使用键 UIImagePickerController.InfoKey 的值调用完成转换为 UIImage?(如果其值为 nil,没关系,就是不设置ImageView的image)

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    if let myPicker = picker as! YourPicker {
        myPicker.completionHandler!(info[UIImagePickerController.InfoKey.originalImage] as? UIImage)
    }
    self.dismiss(animated: true, completion: nil)
}

然后只需在按钮操作中调用您的 loadPhotoLibrary 方法,就像这样

@IBAction func loadTopLeftImage(_ sender: Any) {
    loadPhotoLibrary(setImageView: topLeftImage)
}
...

1- 如果您使用故事板,请控制所有按钮并将其拖动到相同的方法。 如果您为每个按钮添加一个目标,请使用相同的方法显示所有选择器。

2- 添加标签: 在故事板中 -> 你的按钮 -> 给每个按钮一个独特的标签 在代码中添加 button.tag = uniqueTag

3- 在您的通用方法中,您可以为每个按钮

使用一个开关 (sender.tag)