it-swarm.com.ru

HTML формат в UITextView

я довольно новичок в разработке для iOS и сейчас работаю над приложением, которое получает какие-то данные JSON. Но некоторые Бэкэнд Эксперты считали, что для Пользователя будет лучше, если он просто скопирует Информацию прямо из Word и вставит ее в Информационную Систему. Поэтому я сижу здесь, пытаясь сделать кликабельную ссылку в UITableView.

Я анализирую данные из Интернета и получаю строку в следующем формате:

F&uuml;r mehr Informationen klicken sie <a href="http://www.samplelink.com/subpage.php?id=8">here</a>.

Я уже пробовал UILabel, но после некоторых исследований я использую часто предлагаемый UITextView. В инспекторе атрибутов я установил его как текст атрибута и включил обнаружение ссылок. Теперь текст отображается красным цветом и является кликабельным. 

Проблема сейчас для меня заключается в том, что теги HTML и правильный (немецкий) набор символов по-прежнему отсутствуют, и я понятия не имел, как правильно их отобразить.

Показанная строка анализируется следующим образом:

    func showHTMLString(unformattedString: String) -> NSAttributedString{
    var attrStr = NSAttributedString(
        data: tmpString.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)
    return attrStr!
}

Если я заполняю Textview с помощью attrStr?.string, формат отображается корректно, но ссылка также исчезает.

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

Заранее спасибо AR4G4

10
a2hur

Проблема в том, что вам нужно изменить параметры кодировки символов с NSUnicodeStringEncoding на NSUTF8StringEncoding, чтобы загрузить ваш html надлежащим образом. Я думаю, что вы должны создать вычисляемое свойство только для чтения строки, чтобы преобразовать ваш HTML-код в приписанную строку:

Xcode 8.3.1 • Swift 3.1

extension Data {
    var attributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print(error)
        }
        return nil
    }
}
extension String {
    var data: Data {
        return Data(utf8)
    }
}

let htmlStringCode = "F&uuml;r mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>"

htmlStringCode.data.attributedString?.string ?? ""  // "Für mehr Informationen klicken sie here"

в твоем случае

yourTextView.attributedText = htmlStringCode.data.attributedString
26
Leo Dabus

Проверьте атрибуты вашего UITextView в IB. Чтобы ссылки работали, вы должны проверить Selectable.

enter image description here

2
fred02138

Я бы порекомендовал отображать HTML в UIWebView. Это более надежно, чем использование UITextView. Смотрите Показать HTML-текст в uitextview для получения дополнительной информации.

1
tng

Я использовал код для Swift 4:

var descriptionStr : String = String() //Dynamic text

let regex = try! NSRegularExpression(pattern: "<.*?>", options: [.caseInsensitive])
        let range = NSRange(location: 0, length: descriptionStr.count)
        let htmlLessString: String = regex.stringByReplacingMatches(in: descriptionStr, options: NSRegularExpression.MatchingOptions(), range:range, withTemplate: "")
        textViewRef.text = htmlLessString
1
Mannam Brahmam

У меня было приложение, в котором был UITextView, где я хотел иметь возможность вставлять текст в формате html из браузера, а затем сохранять его в виде строки (содержащей формат html) в базе данных, а затем в другой раз извлечь его из базы данных и показать его с тем же форматом, который был впервые скопирован с веб-сайта . Мне удалось это сделать, сделав следующие два расширения:

extension String
{
    func getAttributedStringFromHTMLString() -> NSAttributedString
    {
        do {
            let attributedString = try NSAttributedString(data: self.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType], documentAttributes: nil)
            return attributedString
        } catch {
            print(error)
            return NSAttributedString()
        }
    }
}

extension NSAttributedString
{
    func getHTMLString() -> String
    {
        var htmlText = "";
        let documentAttributes = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
        do {
            let htmlData = try self.dataFromRange(NSMakeRange(0, self.length), documentAttributes:documentAttributes)
            if let htmlString = String(data:htmlData, encoding:NSUTF8StringEncoding) {
                htmlText = htmlString
            }
            return htmlText
        }
        catch {
            print("error creating HTML from Attributed String")
            return ""
        }
    }
}
0
Claudia Fitero

Ваши версии довольно близки для начала. Как сказал Леонардо Савио Дабус, вам, вероятно, стоит попробовать NSUTF * StringEncoding. Следующее дает ожидаемый результат для меня. По его словам, вы можете добавить его в расширение строки, если вы делаете это много. 

    let theString = "F&uuml;r mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>."
    let theAttributedString = NSAttributedString(data: str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!,
                                                 options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil, error: nil)
    theTextView.attributedText = atString
0
Jeremy Pope

Еще один способ, который я использовал для этого: 

var someHtmlString = "F&uuml;r mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>."
let regex = try! NSRegularExpression(pattern: "<.*?>", options: [.CaseInsensitive])
let range = NSRange(location: 0, length: someHtmlString.characters.count)
let htmlLessString: String = regex.stringByReplacingMatchesInString(someHtmlString, options: NSMatchingOptions(), range:range, withTemplate: "")

Конечный результат -> htmlLessString is 

"F&uuml;r mehr Informationen klicken sie here."
0
Nebojsa Nadj

После создания вашей приписанной строки вы должны установить свойство attributedText для UITextView как само NSAttributedString, а не как свойство string этой приписанной строки.

0
Rob