我有一个UITextView
,可以通过点击来选择文字。如果点击它,则通过更改NSForegroundColor
属性以彩色突出显示该单词。
再次点击它会通过将颜色更改回文本颜色来取消选择它。
现在我需要知道UITextView
中所有选定的单词。
第一个想法是删除所有特殊字符并在空间分割文本。然后检查颜色属性是否等于每个单独单词的选定/突出显示颜色。
但属性字符串不允许拆分字符或删除组件。 NSAttributedString
也没有。
第二个想法是将突出显示的部分的范围保存在数组中并迭代它以获得突出显示的部分。但这对我来说似乎有点过于复杂,特别是因为我需要正确的单词顺序,因为它们看起来无法保证数组,每个水龙头都添加/删除 (例如,假设文本是:“这是一个测试”
Tap this -> index 0
Tap test -> index 1
Tap this -> test becomes index 0
Tap this -> this becomes index 1
然后订单不再好了。
我已经弄明白了如何获取属性字符串的颜色。那不是问题。
如何迭代属性字符串并找出改变颜色的单词或解决此问题的最佳方法是什么?
谢谢!
问候
答案 0 :(得分:2)
您可以遍历属性字符串以查找颜色属性。
以下代码演示了如何:
// This generates a test attributed string.
// You actually want the attributedText property of your text view
let str = NSMutableAttributedString(string: "This is a test of the following code")
str.addAttributes([NSForegroundColorAttributeName:UIColor.red], range: NSMakeRange(0, 4))
str.addAttributes([NSForegroundColorAttributeName:UIColor.red], range: NSMakeRange(8, 1))
str.addAttributes([NSForegroundColorAttributeName:UIColor.red], range: NSMakeRange(15, 2))
print(str)
以上版画:
This{
NSColor = "UIExtendedSRGBColorSpace 1 0 0 1";
} is {
}a{
NSColor = "UIExtendedSRGBColorSpace 1 0 0 1";
} test {
}of{
NSColor = "UIExtendedSRGBColorSpace 1 0 0 1";
} the following code{
}
此代码处理属性字符串。使用前景色格式化的任何文本范围都将放入单词数组中。
var words = [String]()
str.enumerateAttribute(NSForegroundColorAttributeName, in: NSMakeRange(0, str.length), options: []) { (value, range, stop) in
if value != nil {
let word = str.attributedSubstring(from: range).string
words.append(word)
}
}
print(words)
打印:
[“This”,“a”,“of”]
答案 1 :(得分:0)
我可以建议您为所选范围创建某种存储,然后根据此范围,您可以自定义这些字的外观,而不是其他方式。它允许您每次访问选定的单词而不检查整个文本的属性。
答案 2 :(得分:0)
虽然我同意Piotr您应该存储Ranges
,但要回答您的问题:
attributedString.enumerateAttributes(in: NSMakeRange(0, attributedString.length), options: []) { attributes, range, _ in
if let color = attributes[NSForegroundColorAttributeName] as? UIColor,
color == YOUR_HIGHLIGHT_COLOR {
let nString = attributedString.string as NSString
let word = nString.substring(with: range)
// Do what you want with the word
}
}