我正在尝试改变用口语单词设置的文本字段中的单词颜色(例如:快乐,悲伤,愤怒等)。 如果不止一次说出这个词,它就不起作用。例如,如果我说,“我感到高兴,因为我的猫对我很好。我哥哥让我伤心。我再次开心。”它只会改变第一个'快乐'的颜色,我不确定为什么。
func setTextColor(text: String) -> NSMutableAttributedString {
let string:NSMutableAttributedString = NSMutableAttributedString(string: text)
let words:[String] = text.components(separatedBy:" ")
for word in words {
if emotionDictionary.keys.contains(word) {
let range:NSRange = (string.string as NSString).range(of: word)
string.addAttribute(NSForegroundColorAttributeName, value: emotionDictionary[word], range: range)
}
}
return string
}
谢谢!
答案 0 :(得分:0)
您的代码存在两个问题。
第一个问题是你的例子中的标点符号。当你这样做时:
text.components(separatedBy:" ")
生成的数组如下所示:
["I'm", "feeling", "happy", ..., "making", "me", "sad."]
悲伤中有一段时间,如果关键只是“悲伤”,那么你的情感词典就不会匹配。
第二个问题是:
let range:NSRange = (string.string as NSString).range(of: word)
由于你在你的例子中有两次“快乐”,这只会返回第一次出现快乐的范围,因此只会突出显示第一次快乐。
最佳途径是为情绪词典中的每个键使用正则表达式。然后你可以调用regex.matches来获取所有出现的快乐或悲伤的范围。然后你可以循环它并适当地设置颜色。
以下内容适用于您的示例:
func setTextColor(text: String) -> NSMutableAttributedString {
let string:NSMutableAttributedString = NSMutableAttributedString(string: text)
for key in emotionDictionary.keys {
do {
let regex = try NSRegularExpression(pattern: key)
let allMatches = regex.matches(in: text, options: [], range: NSMakeRange(0, string.length))
.map { $0.range }
for range in allMatches {
string.addAttribute(NSForegroundColorAttributeName, value: emotionDictionary[key], range: range)
}
}
catch { }
}
return string
}