Это должно сделать это:
let forbiddenLetter = "W"
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
guard let txt = textView.text, let txtRange = Range(range, in: txt) else {
return false
}
let subString: Substring = txt[txtRange]
return !subString.contains(forbiddenLetter)
}
В приведенном выше коде let txt = textView.text
просто для простоты, мы можем оставить принудительное развертывание textView.text!
, так как свойство .text
разработано так, что никогда не вернет nil
для ненулевого UITextView.
По let txtRange = Range(range, in: txt)
мы получаем переменную типа Range<String.Index>
вместо ванильного NSRange, которым является range
.Таким образом мы можем получить подстроку txt
, которую textView собирается изменить.
Наконец, возвращается результат проверки того, содержит ли subString
forbiddenLetter
.
Этот фрагмент не позволит удалить W
с помощью:
- Клавиша Backspace ⌫
- Удаление выделения
- Вставка поверх выделения
- Автозамена (из всплывающего окна)