Отслеживание изменения текста в UITextView при вводе не с клавиатуры

#ios #objective-c #character #uitextview

#iOS #objective-c #символ #uitextview

Вопрос:

У меня есть UITextView, в котором ввод символов ограничен 100 числами. Я могу отслеживать ввод символов с помощью TextView: shouldChangeTextInRange:replacementText: метод, когда текст вводится в текстовое представление с помощью клавиатуры. В моем случае также есть вероятность, что пользователь просто вводит символы в текстовый вид при нажатии кнопки без какого-либо прерывания работы клавиатуры. В таком случае вышеупомянутый метод делегирования не вызывается, и поэтому я не могу отслеживать количество символов в текстовом представлении и, таким образом, разрешать более 100 символов. Как следует обращаться с таким случаем? Пожалуйста, помогите.

Ответ №1:

Вы можете попробовать приведенный ниже код Swift 3:-

 @IBAction func buttonClicked(sender: AnyObject) {
          self.textView.text = self.textView.text   "AA" //suppose you are trying to append "AA" on button click which would call the below delegate automatically
        }

//Below delegate of UITextViewDelegate will be called from keyboard as well as in button click
func textViewDidChangeSelection(_ textView: UITextView) {
        if textView.text.characters.count > 100 {

            let tempStr = textView.text
            let index = tempStr?.index((tempStr?.endIndex)!, offsetBy: 100 - (tempStr?.characters.count)!)
            textView.text = tempStr?.substring(to: index!)
        }
    }
 

Ответ №2:

Насколько я понимаю, у вас есть пользовательские кнопки, которые добавляют некоторый текст к существующему текстовому полю, верно?

В этом случае вы можете реализовать метод проверки

 func validateString(string: String) -> Bool {
    return string.characters.count <= 100
}
 

И используйте его в shouldChangeCharactersInRange обратных вызовах методов и кнопок:

 func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
    let currentString: NSString = (textField.text ?? "") as NSString
    let newString = currentString.replacingCharacters(in: range, with: string)
    return  validateString(string: newString)
}

@IBAction func buttonPressed() {
    let newString = textField.text   "a" //replace this line with your updated string
    if validateString(string: newString) {
        textField.text = newString
    }
}