Как искать слово в атрибутивном тексте в swift 3? - PullRequest
0 голосов
/ 03 июля 2018

Здесь я получил атрибутивный текст из API, в котором он отображается в текстовом представлении, но позже я получил требование, чтобы атрибутивный текст нуждался в поиске, и когда слово ищется, оно должно отображать цвет выделения для совпадающих слов в данном HTML приписанный текст и для отображения приписанного текста я использовал текстовое представление, я попробовал ниже код, и здесь у меня не было никакой функции, чтобы передать приписанную строку к поиску, и попробовал ниже функцию, сработавшую, но html тэги, показывающие в текстовом представлении, могут любой помочь мне решить вопрос?

вот мой код

 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchText != "" {
            let attributedString = generateAttributedString(with: searchText, targetString: (self.FAQModel?.content)!)
            self.FAQTextView.attributedText = attributedString
        }
        else {
            let attributedString = self.FAQModel?.content.htmlAttributedString(fontSize: 14.0)
            self.FAQTextView.attributedText = attributedString
        }
    }

    func generateAttributedString(with searchTerm: String, targetString: String) -> NSAttributedString? {
        let attributedString = NSMutableAttributedString(string: targetString)
        do {
            let regex = try NSRegularExpression(pattern: searchTerm, options: .caseInsensitive)
            let range = NSRange(location: 0, length: targetString.utf16.count)
            for match in regex.matches(in: targetString, options: .withTransparentBounds, range: range) {
                attributedString.addAttribute(NSAttributedStringKey.font, value: UIFont.systemFont(ofSize: 14), range: match.range)
                attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: match.range)
            }
            return attributedString
        } catch _ {
            NSLog("Error creating regular expresion")
            return nil
        }
    } 

1 Ответ

0 голосов
/ 03 июля 2018

Проблема:

let attributedString = NSMutableAttributedString(string: targetString)

Вы создаете NSAttributedString со своей строкой HTML без разбора. Итак, вы видите теги HTML.

У вас уже есть свой собственный метод, который анализирует строку HTML в NSAttributedString, использует ее (и помните, что нам нужен изменяемый):

let attributedString = NSMutableAttributedString(attributedString: targetString.htmlAttributedString(fontSize: 14.0))

Теперь преобразование NSAttributedString удалило теги HTML (и интерпретирует их, если это возможно, потому что NSAttributedString не интерпретирует ВСЕ теги HTML, только несколько). Так что длина, диапазоны все разные.

Так что вы больше не можете этого делать:

let range = NSRange(location: 0, length: targetString.utf16.count)

Вам необходимо обновить его до:

let range = NSRange(location: 0, length: attributedString.string.utf16.count)

То же самое здесь:

for match in regex.matches(in: targetString, options: .withTransparentBounds, range: range) {

Будет обновлено до:

for match in regex.matches(in: attributedString.string, options: .withTransparentBounds, range: range) {
...