2016-08-20 195 views
0

我用attributedString來改變textView文本的一部分的顏色。問題在於它只會改變它找到的第一個字符串的顏色,並且區分大小寫。我希望它改變文本中所有相同字符串的顏色。任何人都知道如何爲它編寫一個循環? 這裏是我的代碼belongsString和textView顏色變化for循環

class ViewController: UIViewController { 
    @IBOutlet var textView: UITextField! 
    @IBOutlet var textBox: UITextField! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     let text = "Love ,love, love, love, Love" 
     let linkTextWithColor = "love"   
     let range = (text as NSString).rangeOfString(linkTextWithColor) 

     let attributedString = NSMutableAttributedString(string:text) 
     attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range) 

     self.textView.attributedText = attributedString 
    } 
} 

它只是改變了第一個「」它找到。

這裏是輸出:

Example output

+1

所以你要整個字符串的顏色爲紅色?或者你想'愛'''L'是小寫字母的紅色?還是其他什麼? – Lion

回答

1
let s = "love, Love, lOVE, LOVE" 

let regex = try! NSRegularExpression(pattern: "love", options: .CaseInsensitive) 

let matches = regex.matchesInString(s, options: .WithoutAnchoringBounds, range: NSRange(location: 0, length: s.utf16.count)) 

let attributedString = NSMutableAttributedString(string: s) 

for m in matches { 
    attributedString.addAttributes([NSForegroundColorAttributeName: UIColor.redColor()], range: m.range) 
} 
+0

NSRegularExpression使用基於UTF-16的範圍,'s.characters.count'應該是's.utf16.count'。 – OOPer

+0

@OOPer謝謝,修復 – Kubba

+0

非常感謝。而已。 –

1

我會用NSRegularExpression,但如果你喜歡rangeOfString方法,你可以寫這樣的事情:

let text = "Love ,love, love, love, Love" 
let linkTextWithColor = "love" 

var startLocation = 0 
let attributedString = NSMutableAttributedString(string:text) 
while case let range = (text as NSString).rangeOfString(linkTextWithColor, 
                 options: [.CaseInsensitiveSearch], 
                 range: NSRange(startLocation..<text.utf16.count)) 
    where range.location != NSNotFound 
{ 
    attributedString.addAttribute(NSForegroundColorAttributeName, 
            value: UIColor.redColor(), 
            range: range) 
    startLocation += range.length 
}