как обнаружить изменение UIImageView ИЛИ KVO работает с UIImageView в Swift

Я пытаюсь обнаружить, что UIImageView (UIimage) изменился или не использует KeyValueObserver или любой другой возможный метод, в моем представлении изображения было изображение при его первой загрузке, поэтому это не image.image != nil. Я использую UIPickerController, поэтому, когда я выбираю изображение, значение изменится , я хочу обнаружить это изменение, чтобы запустить некоторый код, например для Пример: изменить цвет кнопки ИЛИ включить его

btn.backgroundColor = UIColor.green
btn.isEnabled = true

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

let driverPImg: UIImageView = {
        let image = UIImageView(image: #imageLiteral(resourceName: "DriverPimg"))
        image.layer.cornerRadius = 75
        image.clipsToBounds = true
        image.contentMode = .scaleAspectFill
        image.isUserInteractionEnabled = true
        image.translatesAutoresizingMaskIntoConstraints = false
        return image
    }()
let key1: String = "key1"
        // in ViewDidLoad
        override func viewDidLoad() {
                super.viewDidLoad()
    
          self.ProfileImg.image!.addObserver(self, forKeyPath: key1, options: .new, context: nil)
    }


override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == key1{
            print("not changed")
        }else{
        print("it did changed")
        }
    }

person Cloud Music    schedule 06.10.2020    source источник
comment
Вместо key1 следует использовать image? Тем не менее, почему вы пытаетесь наблюдать за изображением изображения? Это кажется странным.   -  person Sweeper    schedule 06.10.2020
comment
потому что я не могу сделать это images nil"> stackoverflow.com/questions/64183657/ в представлении изображения есть изображение-заполнитель, поэтому оно не nil, поэтому я не могу проверить, является ли оно @Sweeper или нет   -  person Cloud Music    schedule 06.10.2020
comment
Как насчет того, чтобы сделать расширение UIImageView и переопределить свойство image? а затем настроить willSet и didSet?   -  person RY_ Zheng    schedule 06.10.2020
comment
не могли бы вы объяснить в коде, пожалуйста, я не знаю, о чем вы говорите ???? на самом деле, я никогда не использовал did and willSet в своей жизни @RYZheng   -  person Cloud Music    schedule 06.10.2020


Ответы (1)


  1. подкласс UIImageView
  2. переопределить свойство image
  3. сделать какое-то суждение в didSet методе

class SUIImageView: UIImageView {
    open var didSetImageBlock: ((_ image: UIImage?) -> Void)?
    open override var image: UIImage? {
        didSet {
            print("did Set image")
            if let didSetImage = didSetImageBlock {
                didSetImage(image)
            }
        }
    }
}

let driverPImg: SUIImageView = {
    let image =  let image = SUIImageView(image: #imageLiteral(resourceName: "DriverPimg"))
    image.layer.cornerRadius = 75
    image.clipsToBounds = true
    image.contentMode = .scaleAspectFill
    image.isUserInteractionEnabled = true
    image.translatesAutoresizingMaskIntoConstraints = false
    return image
}()

// Set the placeholder image before `didSetImageBlock` . So the first time
// you set the placeholder image, `didSetImageBlock` won't be triggered. 
// After the `didSetImageBlock` is set, if the image of the ImageView is 
// changed, `didSetImageBlock` will be triggered. 
driverPImg.didSetImageBlock = { (image: UIImage?) in
    //
    print("did Set Image Block")
}

Если вы все еще хотите использовать KVO, лучше прочитайте этот doc.


person RY_ Zheng    schedule 06.10.2020
comment
Я знаю, что прошу слишком много, но как это ответить на мой вопрос, как обнаружить изменение изображения, я не вижу, что строка вашего кода делает это - person Cloud Music; 06.10.2020
comment
обновлено. при первой загрузке didSetImageBlock не сработает. - person RY_ Zheng; 06.10.2020
comment
хорошо, все работает, у меня есть несколько изображений в одном представлении, могу ли я вызвать их все сразу if all Values change then do this - person Cloud Music; 06.10.2020
comment
и только если все print("did Set Image Block") - person Cloud Music; 06.10.2020
comment
звучит как другой вопрос, или вы должны отредактировать свой вопрос. - person RY_ Zheng; 07.10.2020