2017-02-01 68 views
0

我有一個UITextView,它允許通過點擊文本來選擇文字。如果輕擊,則通過更改NSForegroundColor屬性以突出顯示該單詞的顏色。 再次點擊可以通過將顏色更改回文本顏色來取消選擇它。獲取屬性字符串的顏色變化詞

現在我需要知道UITextView中所有選定的單詞。

第一個想法是刪除所有特殊字符並在空間處分割文本。然後檢查顏色屬性是否等於每個單獨詞的選定/高亮顏色。 但歸因字符串不允許在字符處拆分或刪除組件。 NSAttributedString也沒有。

第二個想法是將突出顯示部分的範圍保存在一個數組中,並遍歷它以獲取突出顯示的部分。但是這對我來說似乎有些複雜,尤其是當我需要正確的單詞出現順序時,它不能保證數組,在每個分支上添加/刪除 (例如,讓我們說文本是:「這是測試」

Tap this -> index 0 
Tap test -> index 1 
Tap this -> test becomes index 0 
Tap this -> this becomes index 1 

那麼該命令是不好了。

我已經想通了如何獲得一個屬性串的顏色,這是沒有問題的。

我如何可以遍歷歸屬字符串並找出顏色已改變的詞或解決此問題的最佳方法?

謝謝!

問候

回答

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) 

此打印:

[ 「這」, 「一」, 「的」]

+0

謝謝,作品像魅力! –

0

我可以建議你創造一些類型的存儲選定範圍,然後根據這個範圍,你可以自定義這個詞,而不是其他方式的樣子。它將允許您每次訪問選定的單詞而不檢查整個文本的屬性。

+0

感謝您的建議。 正如我理解你爲什麼建議它,我堅持使用另一種方法,因爲它對於我的項目遍歷整個字符串一次並不關鍵。 –

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 
    } 
}