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

#swift

#swift

Вопрос:

Я использую UIPresentationController , чтобы предотвратить случайное закрытие пользователем UIViewController модально представленного, если пользователь внес какие-либо изменения. Все работает так, как должно, когда дело доходит до UITextFields, поскольку я обнаруживаю изменения с .editingChanged помощью . Пример кода показан ниже. У меня есть UIImageView , где пользователь может изменить, чтобы предоставить фотографию профиля. Я могу включить кнопку сохранения ( rightBarButtonItem ) после того, как пользователь загрузил изображение, используя didFinishPickingMediaWithInfo в UIImagePickerController, но это не помешает случайному закрытию UIViewController. В идеале я хотел бы изменить значение переменной hasChanges, но это свойство только для получения.

 var hasChanges: Bool {
    guard let customer = customer else { return false }
    
    if
        firstNameTextField.text!.isNotEmpty amp;amp; firstNameTextField.text != customer.firstName
        // additional textfields etc…
    {
        return true
    }
    
    return false
    
}

override func viewWillLayoutSubviews() {
    // If our model has unsaved changes, prevent pull to dismiss and enable the save button
    let hasChanges = self.hasChanges
    isModalInPresentation = hasChanges
    saveButton.isEnabled = hasChanges
}

@objc func cancel(_ sender: Any) {
    if hasChanges {
        // The user tapped Cancel with unsaved changes
        // Confirm that they really mean to cancel
        confirmCancel(showingSave: false)
    } else {
        // No unsaved changes, so dismiss immediately
        sendDidCancel()
    }
}



@objc func textFieldDidChange(_ textField: UITextField) {
    if hasChanges {
        navigationItem.rightBarButtonItem?.isEnabled = true
    } else {
        navigationItem.rightBarButtonItem?.isEnabled = false
    }
}



func setupTextFieldDelegates() {
    let textFields = [all the textfields are included here]
    
    for textField in textFields {
        textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
    }
}
  

Ответ №1:

Для достижения этой цели вам необходимо создать пользовательский UIImageView, где вам нужно создать переменную делегата и протокол с методом и переопределить переменную image.

при переопределении переменной image вам необходимо вызвать метод делегирования внутри метода didSet переменной.

 class CustomImageView: UIImageView{
    override var image: UIImage?{
        didSet{
            delegate?.didChangeImage()
        }
    }
    
    var delegate: ImageViewDelegate?
    
}

protocol ImageViewDelegate {
    func didChangeImage()
}
  

Затем в вашем ViewController установите делегат.

 class ImageViewController: UIViewController {
    
    @IBOutlet weak var imageView: CustomimageView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        imageView.delegate = self
    }
    

}
  

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

Комментарии:

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