【问题标题】:Converting HTML Tag to String将 HTML 标记转换为字符串
【发布时间】:2017-09-11 12:27:31
【问题描述】:

我想把HTML Tag转换成String,我用enumString的内容长度,根据长度我需要做一些操作。

我的modal 班级,

class PostViewModel {
    var content: TextContent
    enum TextContent {
            case expanded(String)
            case collapsed(String)

            static func == (lhs: TextContent, rhs: TextContent) -> Bool {
                switch lhs {
                case .collapsed(let content):
                    if case collapsed(content) = rhs {
                        return true
                    }
                    return false
                case .expanded(let content):
                    if case expanded(content) = rhs {
                        return true
                    }
                    return false
                }
            }
        }
    }

我在cellForItem(at index: Int) 中调用这个函数,

func applyVerticalSizeConcernedRendering(fromViewModel viewModel: PostViewModel) {
    switch viewModel.content {
        case .collapsed(let content):
            let str = content.html2String
            print(str)
        case .expanded(let content):
            break
    }
}

html2StringextensionString 的类

extension String {
      var html2AttributedString: NSMutableAttributedString? {
      guard let data = data(using: String.Encoding.utf8) else { return nil }
            let attrs: [String: Any] = [
                NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue
            ]
            do {
                let attrStr = try NSMutableAttributedString(data: data, options: attrs, documentAttributes: nil)
                return attrStr
            } catch let error as NSError {
                print(error.localizedDescription)
                return  nil
            }
        }
        var html2String: String {
            return html2AttributedString?.string ?? ""
        }
    }

问题是它在将 HTML 标记转换为 String 时崩溃

这里崩溃了,

let attrStr = try NSMutableAttributedString(data: data, options: attrs, documentAttributes: nil)

而且String 不为空

下面是HTML String的例子,

<strong>I want to test HTML Tags<br><\/strong>dsfhjdjf sjdfdj  djfjdfj djkf dfjdhf <strong>adjf<br>asks <\/strong>djfdkf<br><strong>dfdjk dkfjdk <\/strong>dfjik iai <strong>adsfhj<\/strong>

当我尝试使用硬编码值时,这工作正常,但只有当我从 enum 获得 String 时它才会崩溃

崩溃日志是,

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'

有人可以帮忙吗?

【问题讨论】:

  • 你能添加一个异常断点并检查它到底在哪一行失败了吗?
  • @TMob 我在问题中进行了编辑,它完全崩溃了
  • 您尝试转换的 HTML 字符串是否有可能为空?
  • @MilanNosáľ 我 100% 确定,这不是空的
  • 您可以将其添加到问题中吗?以便我们重现问题

标签: ios swift enums


【解决方案1】:

试试这个,不需要做你所做的整个过程:

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

}

用法:

let html = "<strong>I want to test HTML Tags<br></strong>dsfhjdjf sjdfdj  djfjdfj djkf dfjdhf <strong>adjf<br>asks</strong>djfdkf<br><strong>dfdjk dkfjdk </strong>dfjik iai <strong>adsfhj</strong>"
let str = html.htmlString

所以你基本上只是在你的字符串上使用String extension。这是我在我的项目中使用的

更新:
以上打印出以下内容:

Here 是一个您可以尝试的示例项目。

【讨论】:

  • 仍然崩溃,但崩溃日志不同,-[_SwiftValue unsignedIntegerValue]: unrecognized selector sent to instance 0x60000025be70*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_SwiftValue unsignedIntegerValue]: unrecognized selector sent to instance 0x60000025be70'
  • 这很奇怪。查看我对代码打印内容的更新,我还添加了一个示例项目,您可以尝试。
  • 请查看更新后的问题,它适用于硬编码值
猜你喜欢
  • 2022-01-19
  • 2017-10-17
  • 1970-01-01
  • 2019-10-31
  • 2013-08-14
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多