iOS NSAttributedString为HTML

我有一个NSAttributedstring(来自HTML),我为UITextView设置。

 - (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,但它不是我想要的。 所有东西都有一个class属性,它放在文档的顶部。 像图像和链接甚至没有包括在返回的HTML中,可能还有更多的问题。

有没有更好的方式从NSAttributedString获取HTML? 或者,有没有办法我可以parsingNSAttributedString并写我自己的HTML?

也许你可以看看这个存储库: https : //github.com/IdeasOnCanvas/Ashton

有两个有趣的课程:

 AshtonHTMLReader.h - (NSAttributedString *)attributedStringFromHTMLString:(NSString *)htmlString; 

作者:

 AshtonHTMLWriter.h - (NSString *)HTMLStringFromAttributedString:(NSAttributedString *)input; 

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

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

这是丑陋的,但它的作品=>我已经使用这个过程创build和编辑一些HTML文件几个月前

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

我们也尝试去属性string路线,但发现它不适合完整的HTML编辑。 许多元素只是不被支持,或者是因为转换器没有完全开发,或者这些元素被苹果公司视为范围之外。 parsing属性string还不够好,因为在您试图重新创buildHTML时,属性string已经失去了HTML的大部分丰富性。

相反,我们使用webview,正常加载文档,并在body元素上启用contentEditable 。 这样做是允许编辑文档的最大限度,只受WebKit的限制。 最后,为了检索HTML,我们禁用了contentEditable并使用document.outerHTML来获取完整的HTML,就像以前一样,用户进行了更改。

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

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

我还必须在我的一个项目中将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);