24

我有一个NSAttributedUITextView.

- (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. 或者,有没有一种方法可以解析NSAttributedString并编写自己的 HTML?

4

3 回答 3

13

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

有 2 个有趣的课程:

AshtonHTMLReader.h

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

还有作者:

AshtonHTMLWriter.h

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

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

图像的简单想法:使用base64对其进行编码,并将其直接放在带有正确框架的<img>标签中。

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

于 2014-02-05T16:40:19.457 回答
9

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

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

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

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

我将根据需要扩展此答案。

于 2014-02-04T18:42:02.050 回答
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);
于 2016-10-03T13:00:19.983 回答