#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. Ваш код очень полезен и выполняет часть того, что я задумал. Я нашел другой способ выполнить задачу, добавив другое логическое значение.