Быстро добавить цель для действия вставки UITextField

У меня есть UITextField с добавленной целью, которая выполняет проверки поля по мере ввода пользователем. Однако в настоящее время у меня есть проблема, когда мой код добавляет текст в текстовое поле, в котором текст не проверяется. Есть ли способ решить эту проблему с помощью .editingChanged или есть другой UIControlEvent, к которому можно подключиться?

Код:

NumberOutlet.addTarget(self, action: #selector(handleNumberImage), for: .editingChanged)

person user7684436    schedule 27.03.2017    source источник
comment
Я не понимаю часть с когда мой код добавляет текст в текстовое поле в том смысле, что текст не проверяется . Можете ли вы объяснить более подробно или добавить пример?   -  person ronatory    schedule 27.03.2017
comment
Хорошо, я думаю, я понимаю, что вы имеете в виду. Видел ваш комментарий к другому ответу   -  person ronatory    schedule 27.03.2017


Ответы (3)


Вы можете справиться с этим, внедрив протокол UITextViewDelegate в свой контроллер представления. В вашем viewDidLoad вы хотели бы установить делегата вашего UITextField на self.

Затем просто реализуйте следующий метод, как показано здесь:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if string.length > 1 {
        // Text was pasted into the text field

        // do something with pasted text
    } else {
        //typed string
    }
    return true
}
person Forest Kunecke    schedule 27.03.2017
comment
У меня это на месте. Я хочу определить, когда код добавляет что-то в текстовое поле. Обновил мой вопрос для большей ясности. - person user7684436; 27.03.2017

Вы захотите соответствовать протоколу UITextFieldDelegate.

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    let isAddingCharacter: Bool = range.location >= 0 && range.length == 0
    let isDeletingCharacter: Bool = range.location >= 0 && range.length == 1
    var newCount: Int = textView.text.characters.count
    if isAddingCharacter {
        newCount += 1
    } else if isDeletingCharacter {
        newCount -= 1
    }
    // If the newCount is > 0, the user is entering text
    return true
}

Примечание: ваша торговая точка должна называться numberOutlet, а не NumberOutlet. В Swift принято использовать синтаксис верблюжьего регистра для имен переменных.

person Chandler De Angelis    schedule 27.03.2017

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

Например, у вас есть метод, который выполняется после нажатия кнопки, и вы добавляете текст в свое текстовое поле, а UIControlEvent здесь не срабатывает. Поэтому просто вызовите метод после добавления текста с помощью кода в этом примере после нажатия кнопки:

@IBAction func buttonPressed(_ sender: UIButton) {
  // Note: camel case convention
  numberOutlet.text?.append("added text via code")
  // perform your check method
  handleNumberImage()
}
person ronatory    schedule 27.03.2017
comment
Я пробовал это заранее. Проблема в том, что shouldChangeCharactersIn не срабатывает при добавлении. - person user7684436; 28.03.2017
comment
Итак, вы хотите иметь возможность выполнить свой метод проверки и textField(_:shouldChangeCharactersIn:replacementString:)? Потому что я понял, что вы хотите выполнить свой метод проверки только после добавления текста через код. Пожалуйста, обновите свой вопрос с примером и всей информацией, что вы именно хотите сделать. Это, вероятно, также полезно для других - person ronatory; 28.03.2017