复制 HTML 到 UIPasteboard。

4
我想将HTML从我的应用程序传输到iPhone邮件应用程序。 我已经有了HTML文本 - 假设是<span style='color:red'>Test</span> 我可以将其放置在UIPasteBoard中 - 但是当我将其粘贴到邮件中时,我得到的是HTML源代码。
当我将相同的字符串放置在HTMLView中 - 在那里选择它并复制它,它会作为红色文本粘贴到邮件中。
我该怎么做才能将字符串放置在UIPasteBoard中,以便将其作为红色文本粘贴到邮件应用程序中? 我一直在搜索“格式类型” - 并发现当我在剪贴板中拥有元素(从UIWebView复制)时,UIPasteBoard返回“Aplle Web Archive pasteboard type”。 但是,将此设置为添加到UIPasteBoard中的内容的类型后,在邮件应用程序中没有粘贴任何内容。
Manfred
5个回答

9

请问您能告诉我在3.x UIPasteBoard文档中,这些其他内容(“ANYTHING”)可以找到吗? 我遵循了您友好的建议并阅读了文档:http://developer.apple.com/iphone/library/documentation/uikit/reference/UIPasteboard_Class/Reference.html#//apple_ref/doc/uid/TP40008243-CH1-SW49也许还有其他文档需要我阅读 - 请告诉我它们在哪里。 - ManniAT

6
我已经成功实现了HTML复制,可以正确地粘贴到内置的邮件和备忘录应用程序中。效果如下:
NSString *htmlContent = @"This is <span style='font-weight:bold'>HTML</span>";
NSString *content = @"This is HTML!";
NSDictionary *dict = @{(NSString *)kUTTypeText: content, (NSString *)kUTTypeHTML: htmlContent};
[[UIPasteboard generalPasteboard] setItems:@[dict]];

为了访问这些类型常量,您需要导入以下内容:
#import <MobileCoreServices/UTCoreTypes.h>

1

在您在评论中提供的同一个链接上,您会发现在顶部有这段文字。

统一类型标识符(UTI)通常用于表征类型(有时称为剪贴板类型)。例如,您可以使用 kUTTypeJPEG(一个公共.jpeg的常量)作为 JPEG 数据表示类型。但是,应用程序可以自由地使用任何字符串作为表示类型;但是,对于特定于应用程序的数据类型,建议使用反向 DNS 符号来确保类型的唯一性(例如,com.myCompany.myApp.myType)。

它的下面是一个到这里的链接。http://developer.apple.com/iphone/library/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html#//apple_ref/doc/uid/TP40001319

其中解释了UTIs。

最后,这个链接提供了几种类型http://developer.apple.com/iphone/library/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259-SW1

当然,这个列表并不是所有的类型,因为你可以创建自己的类型。

我已经成功地将HTML粘贴到邮件应用程序中。我会给你一个好的起点...

创建一个应用程序,显示剪贴板中的数据类型。在设备上打开Safari,复制一个网页。运行你的应用程序,你会注意到剪贴板类型是“Apple Web Archive pasteboard type”。请注意,这实际上是一个剪贴板类型(自定义类型)。如果你尝试通过创建Web存档并尝试将其作为文本粘贴到邮件应用程序中来复制和粘贴Safari移动功能,它将显示Web存档文件作为原始XML。如果你将类型定义为“Apple Web Archive pasteboard type”,邮件应用程序将实际上将粘贴内容格式化为HTML。

如果您想知道 Web 存档的样子,可以在桌面版 Safari 中将网页保存为存档文件并在文本读取器中查看该文件(使用 TextEdit 可能会尝试解析它,因此您可能需要使用其他程序查看存档 XML)。
请阅读所有文档,因为您可能会发现可以在您发送给我的链接中自定义类型。

问题在于(在iPhone上而不是桌面电脑上),正如我在最初的问题中所写的,当我将类型设置为(例如)“Apple Web Archive pasteboard type”时,在电子邮件中没有任何内容被粘贴。我还找到了UTIs的扩展名,但我无法让它工作,也没有在网上找到示例。我发现的所有内容(这也是这里的第一个答案)都是“仅在iPhone上可用”。 - ManniAT
哦,顺便说一下(抱歉我忘了),感谢您的努力。如果您能提供一些可用示例的链接,那就太好了。 - ManniAT
我的解决方案是针对iPhone/iPad的。我会看看是否能够创建一个示例。你遇到的问题是与苹果Web Arc....类型相关联的字符串不能仅仅是普通字符串。这是一个相当复杂的过程。你需要创建一个XML文档/字符串,其中实际的HTML内容是base64编码的。请随意至少取消负面投票 :) 我应该最初给你一个详细的答案,抱歉我回答得很简短。 - maxpower
我也在努力解决 iPad 上正确粘贴数字的问题,如果可能的话,我会尝试提供一个示例。但是,我刚刚开始这个过程,可能需要一些时间,还不确定。 - maxpower

0

这是完全可能的。UIPasteboard通常包含多个值,由它们的UTI索引。

以下是一个可行的示例,演示如何获取public.html作为主要类型。

-(NSString * _Nullable) getHtmlFromPB {
    static NSArray * prefs = @[@"public.html",@"public.utf8-plain-text",@"public.plain-text"];
    if (!UIPasteboard.generalPasteboard.hasStrings) return nil;
    for (NSString * theone in prefs) {
        if ([[UIPasteboard generalPasteboard].pasteboardTypes indexOfObject:theone] == NSNotFound) continue;
        return [UIPasteboard.generalPasteboard.items.firstObject objectForKey:theone];
    }
    return nil;
}

如果您需要解释:`prefs` 数组包含所需顺序中剪贴板内容的首选 UTI。因此,它将选择其中一个或什么也不选择。

抱歉,但这个问题已经被问了超过10年 - 事情已经发生了很大的变化。 - ManniAT
无论如何,这个问题仍然存在。我很久以前就看到了它,并且不得不基于@F'x NO理解和实现UIPasteboard的概念和细节。事情已经改变了,但是这个No仍然是最好的答案,许多人(包括我5年前)可以考虑 - 它是真实的,只需从UIPasteboard中获取第一个元素,这可能会难以处理Apple的rtf。因此,更改必须导致更新以了解它们。 - ETech

-17
不行,它不能。UIPasterBoard只接受字符串、图像、URL和颜色。

我害怕有人会这样说 :) 谢谢 - ManniAT
2
尽管此答案已标记为正确,但如下所述,您可以将HTML复制到UIPasteBoard中。请参见maxpower在下面的答案。有关从应用程序中将HTML粘贴到iOS邮件应用程序的简短代码片段,请参见https://dev59.com/61jUa4cB1Zd3GeqPVd8z。 - Obliquely
完全不正确!甚至 UIPasteBoard 的参考文件都说明您可以将自定义文件类型放在剪贴板上。 - Akshay
绝对不是真的,请查看马修发布的链接。我刚刚用那个方法进行了一些红色文本作为其他测试的测试几分钟前。它被粘贴到邮件中作为HTML。 - Peter Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接