NSRegularExpression, соответствующие строки и выделение текста. Работает около 85% времени. Зачем?

Часть приложения, над которым я работаю, берет строку, ищет ее в текстовом поле и затем выделяет только эту строку. Это работает около 85% времени. Остальные 15% приложение ведет себя так, как будто оно выделило текст, но текст не выделен. Нет ошибок

Невозможно, чтобы строки (в текстовом поле и в поле для сравнения) были разными, потому что они из одного источника.

Любая идея, почему атрибут подсветки не применяется, когда это должно быть?

let attributed = NSMutableAttributedString(string: completeText)

var error: NSError?
let regex = NSRegularExpression(pattern: compareString, options: .CaseInsensitive, error: &error)

        if let regexError = error {
            println("Oh no! \(regexError)")
        } else {
            println("highlighted")

for match in regex?.matchesInString(completeText, options: NSMatchingOptions.allZeros, range: NSRange(location: 0, length: count(completeText))) as! [NSTextCheckingResult] {
                attributed.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellowColor(), range: match.range)
            }
        }

completeText.text = completeText // the view receiving the text
completeText.attributedText = attributed //apply highlighting

1 ответ

Решение

Ваши последние строки кода сбивают с толку, вы назначаете completeText в completeText.text неясно, является ли completeText Экземпляр является String или UITextView. Вы также назначаете .text а также .attributedText, который не является необходимым. .text будет доступно автоматически при установке .attributedText свойство и имеет то же значение, что и attributed.string, Поэтому вам нужно только установить .attributedText не .text,

Очистка этих вещей все работает.

let completeText = "Hello World, where are you? Where are you?"
let compareString = "Hello World, where are you\\? Where are you\\?"
let attributed = NSMutableAttributedString(string: completeText)

var error: NSError?
let regex = NSRegularExpression(pattern: compareString, options: .CaseInsensitive, error: &error)

if let regexError = error {
    println("Oh no! \(regexError)")
} else {
    println("highlighted")

    for match in regex?.matchesInString(completeText, options: NSMatchingOptions.allZeros, range: NSRange(location: 0, length: count(completeText))) as! [NSTextCheckingResult] {
        attributed.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellowColor(), range: match.range)
    }
}

let textView = UITextView(frame: CGRect(x: 0, y: 0, width: 400, height: 200))

textView.attributedText = attributed

Но, как вы увидите из моего примера, если определенные символы в вашей строке имеют особое значение в языке RegularExpression, например?, .* И [], вам нужно будет экранировать их, чтобы найти их в строке.

См. Ссылку на класс NSRegularExpression для таблицы специальных символов.

Другие вопросы по тегам