我現在不能測試這個,但想到一個想法; 當你在你的example-string中搜索字符串#hashtag
時,你不覺得它會找到三個位置,並且這可能與它有關嗎?也許不是那個特定的例子字符串,但假設你有字符串"#hellothere #hashtag2 #hashtag #hashtag3"
,並執行你的代碼。 當您循環到字符串"#hashtag"
並使用text.range(of:"#hashtag")
時,它將首先找到字符串"#hashtag2"
。我不確定它是否會繼續尋找多個匹配項,但是使用您的代碼,"#hashtag2"
同樣正確,因爲它包含"#hashtag"
。
我不知道解決這個問題的最佳方法,但我有一些想法。 一個想法可能是以某種方式在您要查找的單詞前後存儲該字母。因此,當您使用text.range(of:string)
時,您不僅要查找"#hashtag"
,還要查找" #hashtag "
。 僅僅在字符串之前和之後添加一個空格是不夠的,因爲它可能已經被另一個符號(逗號或句點等)分隔。
一個更好的解決方案可能是總結字符串的以前的部分,並且「手動」計算您的字符串的範圍,而不是使用text.range(of:string)
。
不是真正的代碼,而是試着去了解我在想什麼:
let text = "#hellothere I am you. #hashtag #hashtag2 @you #hashtag3"
let words = text.components(separatedBy: " ")
let attribute = NSMutableAttributedString.init(string: text)
for (index, word) in words.enumerated() {
if word.hasPrefix("#") {
//Recreate the original string up to this part, so you can find the actual start-index of your current word.
let sentenceBeforeWord = words[0..<index].joined(separator: " ")
let range = //
attribute.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: range)
}
}
label.attributedText = attribute
然後計算你的話(#hashtag)自己的範圍。現在你確切知道你的單詞何時開始(它的startIndex應該是sentenceBeforeWord
之後的一個字母,我認爲你的單詞的開始索引應該等於sentenceBeforeWord
的長度)。而且你已經知道你的單詞的長度。 我不知道如何從頭頂創建NSRange
(NSString) - 或Range
(String) - 對象,但您可能會弄清楚。 您可能還需要修復我的循環中的一些邏輯,因爲我不知道words[0..<index]
將在第一個循環中執行什麼操作(0 .. < 0)。
旁註,當您創建NSRange
- 和/或Range
-對象時要小心。一個字母並不總是一個字母。如果我正確記得,假設字符串範圍的長度等於字符數量並不總是正確的,因爲某些字符(例如表情符號)與常規字母數字字母具有不同的範圍和字符系統。一個表情符號可能是一個字母,但我相信它的範圍是兩個。
來源
2017-03-18 11:09:33
Sti
工作!謝謝! – StudentX