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 для таблицы специальных символов.