2016-08-20 4 views
0

Я использовал attributedString, чтобы изменить цвет части текста в textView. Проблема в том, что он только изменяет цвет первой строки, которую он находит, и чувствителен к регистру. Я хочу, чтобы он менял цвет всех одинаковых строк в тексте. Кто-нибудь знает, как написать цикл для него? Вот мой кодattribittedString и изменение цвета 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

Так что вы хотите цвет цельной строки как красный? или вы хотите красный цвет на 'love', где' 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 
}