当用户在文本视图中键入内容时,我正在查看每个单词,并看到它与我拥有的数组中的单词匹配。如果存在匹配项,则将单词更改为蓝色,并将布尔变量didFindACertainWord
设置为true(以确保只有一个单词为蓝色)。我能够成功完成此部分操作,但出现了一些错误:
我更改为蓝色的特定单词有效,但是在更改字体之前键入的单词以及在该单词之后键入的任何内容也均为蓝色(我不希望如此)。 我只想将某个单词更改为蓝色,并将其他单词保持黑色和以前的字体。
我不知道如何确定用户是否删除了某个单词。如果他们这样做了,我想将某个单词的颜色改回黑色(在他们删除某个单词的第一个字符之后),并将didFindACertainWord
设置为false。
这是我当前的textViewDidChange
方法中的代码:
func textViewDidChange(_ textView: UITextView) {
//get last word typed
let size = textView.text.reversed().firstIndex(of: " ") ?? textView.text.count
let startWord = textView.text.index(textView.text.endIndex, offsetBy: -size)
let lastWord = textView.text[startWord...]
//check if last word is in array and we did not already find one
if certainWords.contains(String(lastWord)) && !didFindACertainWord {
didFindACertainWord = true
//change color of the word
let attributedString = NSMutableAttributedString.init(string: textView.text)
let range = (textView.text as NSString).range(of: String(lastWord))
attributedString.addAttributes([NSAttributedString.Key.foregroundColor: UIColor.blue, NSAttributedString.Key.font: UIFont(name: "Avenir-Roman", size: 18)], range: range)
textView.attributedText = attributedString
}
}
我缺少什么/如何成功完成此操作?附言文本视图中所有文本的字体应为UIFont(name: "Avenir-Roman", size: 18)
我正在搜索每个单词,因为在用户键入一个动作单词后,如果它们与该动作单词相关,则需要阅读下一个单词以使其加粗。例如,如果用户键入“ see Paris London Berlin以找到最好的食物”,则操作词为“ see”,而相关的粗体词为“ Paris Italy France”,而无关的词(将以常规形式显示)字体)是“寻找最好的”
答案 0 :(得分:2)
对于第一个问题,这是因为您应该进行“其他”处理,并重置颜色和布尔值。 您应该添加:
} else {
didFindACertainWord = false
textView.attributedText = attributedString
}
对于第二个单词,您不必只处理最后一个单词,而应检查整个字符串中是否有匹配项。
未经测试,但是应该可以工作:
func textViewDidChange(_ textView: UITextView) {
let attributedString = NSMutableAttributedString(string: textView.text,
attributes: [.font: UIFont(name: "Avenir-Roman", size: 18)])
let allWords = attributedString.string.components(separatedBy: CharacterSet.whitespaces)
if let firstMatch = allWords.first(where: { return certainWords.contains($0)}) {
didFindACertainWord = true
let firstMatchRange = (attributedString.string as NSString).range(of: firstMatch)
attributedString.addAttribute(.foregroundColor, value: UIColor.blue, range: firstMatchRange)
} else {
didFindACertainWord = false
}
textView.attributedText = attributedString
}