【问题标题】:iOS NSAttributedString to HTMLiOS NSAttributedString 到 HTML
【发布时间】:2013-12-17 01:23:18
【问题描述】:

我为UITextView 设置了一个NSAttributed 字符串(来自HTML)。

- (void)setHtml:(NSString *)html {

    NSData *htmlData = [html dataUsingEncoding:NSUTF8StringEncoding];

    // Create the HTML string
    NSDictionary *importParams = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
    NSError *error = nil;
    self.htmlString = [[NSAttributedString alloc] initWithData:htmlData options:importParams documentAttributes:NULL error:&error];

    self.editorView.attributedText = self.htmlString;

}

然后我让用户编辑他们想要的内容,然后我想再次将其转换为 HTML,所以我使用:

- (NSString *)getHTML {
    NSDictionary *exportParams = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
    NSData *htmlData = [self.editorView.attributedText dataFromRange:NSMakeRange(0, self.editorView.attributedText.length) documentAttributes:exportParams error:nil];
    return [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];
}

它确实返回 HTML,但这不是我想要的。一切都被赋予了一个类属性,以及它放在文档顶部的 CSS。图像和链接之类的内容甚至不包含在返回的 HTML 中,而且可能还有更多问题。

有没有更好的方法从NSAttributedString 获取 HTML?或者,有没有办法可以解析NSAttributedString 并编写自己的 HTML?

【问题讨论】:

标签: ios objective-c uitextview nsattributedstring textkit


【解决方案1】:

也许您可以查看该存储库: https://github.com/IdeasOnCanvas/Ashton

有 2 个有趣的课程:

AshtonHTMLReader.h

 - (NSAttributedString *)attributedStringFromHTMLString:(NSString *)htmlString;

作者:

AshtonHTMLWriter.h

- (NSString *)HTMLStringFromAttributedString:(NSAttributedString *)input;

生成的 html 不是很好,但是如果您尝试在 uiwebview 中显示它, 看起来还不错。

图像的简单想法: 用base64编码,直接放在一个标签里,有正确的frame。

它很丑,但它有效 => 几个月前我使用这个过程创建和编辑了一些 html 文件

【讨论】:

  • 这是一个很酷的想法,但检查源代码表明它的解析能力非常有限。样式将是一个问题。
  • 其实这并不理想。但是这个项目用于检索字体、颜色、斜体/粗体样式等...另一个问题是直接将图像使用base64编码到html中会使页面加载时间很长!
  • 作为问题的扩展:我对在不使用 base64 编码的情况下将图像包含在 HTML 中的方法感兴趣。像微软的 .chm 格式,如果有人知道的话!
  • 这个项目很棒!我有一个问题,我想将 UITextView 的属性文本粘贴到用户可以发送给自己的电子邮件中。使用原始问题中的方法导致大部分格式(字体类型和大小)丢失。在这个项目中,你可以调用mn_HTMLRepresentation,它是 NSAttributedString 上的一个类别方法,并将它作为正文传递给 MFMailComposeViewController,瞧,一个格式精美的电子邮件,看起来与它在应用程序的文本视图中完全一样。跨度>
【解决方案2】:

这是一个复杂的问题,我将从一个简短的答案开始。您可以在 cmets 中向我提问,我会根据需要展开答案。

我们也尝试使用属性化字符串路线,但发现它不适合完整的 HTML 编辑。许多元素不受支持,要么是因为转换器尚未完全开发,要么这些元素被 Apple 认为超出了范围。解析属性字符串还不够好,因为当您尝试重新创建属性字符串时,它已经失去了 HTML 的大部分丰富性。

相反,我们使用 webview,正常加载文档,并在 body 元素上启用 contentEditable。这样做是允许对文档进行最全面的编辑,仅受 WebKit 限制。最后,为了取回 HTML,我们禁用 contentEditable 并使用 document.outerHTML 以获取与以前一样的完整 HTML,并由用户进行更改。

不要轻易决定实施此方法。这是一个有点复杂的解决方案,但肯定是可能的。 webview 不如 textview 好,但只要给予足够的按摩,它就可以了。

我会根据需要扩展这个答案。

【讨论】:

  • 感谢您的回复,但我们特意离开 UIWebView 实现,因为它在速度/UIScrollViews 方面存在一些严重问题。除了列表之外,我已经能够让一切正常工作。
  • @JesseNaugher 我在修复 webview 错误方面拥有丰富的知识。如果您有具体问题,可以在这里提问或直接与我联系。不管你怎么看,webview 是最强大的复杂编辑方法,除非你想进入 CoreText(又名 Apple Pages 实现)的世界。
  • 这也是我最终选择的路线。我仍然遇到的一个问题是能够返回有效的 XHTML。你有没有解决这个问题?
  • @NicHubbard 虽然我还没有尝试过,但是提供 XHTML 输入不会起作用吗?我认为编辑后的 ​​HTML 可以很好地保留 XHTML 的严格性。
  • @LeoNatan 是的,确实如此。但是,由于您必须添加一个 xmlns 命名空间,我们发现当我们抓取 innerHTML 时,它会将该属性添加到所有块元素。所以我们不知道如何解决这个奇怪的问题。
【解决方案3】:

我还必须在我的一个项目中将 NSAtttributedString 转换为 HTML。这样做的代码如下

//self.attributed String is the attributedString 
NSDictionary *documentAttributes = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
NSData *htmlData = [self.attributedString dataFromRange:NSMakeRange(0, self.attributedString.length) documentAttributes:documentAttributes error:NULL];
NSString *htmlString = [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];
NSLog(@"%@", htmlString);

【讨论】:

  • 问题中已经说明的这种方法的限制是它跳过了 img 标签。我对其进行了测试,发现 img 标签在 9.0 中被跳过,但适用于 iOS 10
  • 哦,我很高兴它适用于 iOS 10。抱歉,它不适用于 iOS 9
猜你喜欢
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多