【问题标题】:How to use different buttons with a same method for different results?如何以相同的方法使用不同的按钮以获得不同的结果?
【发布时间】:2018-12-18 16:38:27
【问题描述】:

我有四个不同图像的正方形,两个在顶部,两个在底部,从图像库加载后要显示。

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

如何使用四个不同的按钮以相同的方法显示加载到正确位置的图像?

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

谢谢

@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)
}

【问题讨论】:

    标签: swift uibutton uiimage


    【解决方案1】:

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

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

    然后将参数添加到您的loadPhotoLibrary 函数中,该参数将代表您想要更改其imageUIImageView。还要设置它的完成处理程序:你想改变某些 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)
    }
    ...
    

    【讨论】:

      【解决方案2】:

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

      2- 添加标签: 在情节提要中->您的按钮->给每个按钮一个唯一的标签 在代码中添加 button.tag = uniqueTag

      3- 在您的通用方法中,您可以为每个按钮使用一个开关(sender.tag)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 2013-08-22
        • 2021-02-17
        相关资源
        最近更新 更多