Как использовать разные кнопки одним и тем же методом для разных результатов? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть квадрат из четырех разных изображений, два сверху и два снизу, которые будут отображаться после загрузки из библиотеки изображений.

Каждый просмотр изображения связан с его персональной кнопкой, которая будет использовать тот же метод, который используется в пользовательской библиотеке для получения изображения.

Как использовать четыре разные кнопки стот же метод для отображения изображения, загруженного в нужном месте?

Могу ли я создать модель для выполнения этого поведения?

Спасибо

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

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

1 - Если вы используете раскадровку, управляйте и перетащите все свои кнопки одним и тем же способом.Если вы добавляете цель для каждой кнопки, показывайте все селекторы для одного и того же метода.

2- Добавьте тег: В раскадровке -> ваши кнопки (и) -> присвойте каждому уникальный тег В кнопке добавления кода.tag = uniqueTag

3- В вашем универсальном методе вы можете использовать переключатель (sender.tag) для каждой кнопки

0 голосов
/ 18 декабря 2018

Сначала создайте подкласс UIImagePickerController и добавьте переменную completionHandler с параметром типа UIImage?

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

, затем добавьте параметр в вашу функцию loadPhotoLibrary, которая будет представлять UIImageView, который вы хотитеизменить его image.Также установите его обработчик завершения: вы хотите изменить image определенного ImageView

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

, теперь в методе делегата средства выбора downcast picker, как YourPicker и завершения вызова со значением для ключа UIImagePickerController.InfoKey, приведенного кUIImage? (если его значение nil, не имеет значения, просто не устанавливается image ImageView)

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