Изменение цвета атрибута String и TextView в цикле for

ios swift nsattributedstring

225 просмотра

2 ответа

Я использовал attributedStringдля изменения цвета части текста в textView. Проблема в том, что он меняет цвет только первой найденной строки и учитывает регистр. Я хочу, чтобы он изменил цвет всех одинаковых строк в тексте. Кто-нибудь знает, как написать цикл для этого? Вот мой код

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

Это только изменяет первую " любовь ", которую он находит.

Вот вывод:

Пример вывода

Автор: Moeen.V Источник Размещён: 08.11.2019 11:15

Ответы (2)


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)
}
Автор: Kubba Размещён: 20.08.2016 11:50

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
}
Автор: OOPer Размещён: 20.08.2016 12:01
Вопросы из категории :
32x32