对于那些在家玩的人,这是我们发现的答案。
“public.utf8-plain-text”历来是在将包含未格式化文本的 NSString 放入粘贴板时使用的正确 UTI。内置控件在“粘贴”操作期间所有请求和使用此版本的粘贴板内容(适用于 5 之前的 iOS 版本)。如果您只在粘贴板中放置“public.plain-text”或“public.text”文本,内置控件会完全忽略它,说粘贴板是空的(不给您“粘贴”选项)。
在 iOS 5 中,发生了一些变化,当内置控件在上述情况下请求纯文本时,它们将获得“public.html”文本。
对于 iOS 5,您必须使用“public.text”而不是“public.plain-text”或“public.utf8-plain-text”,尽管后两者可以说更正确,而前者太模糊而无法用于全部。
由于早期的 iOS 版本忽略了“public.text”,我们的解决方案是将所有三个版本都放在粘贴板上:“public.text”和“public.utf8-plain-text”都会得到纯文本和“public.html” " 将为您提供 HTML 文本。这似乎可以同时满足 iOS 4 和 5 的要求,而无需在代码中进行明确的 iOS 版本测试,代价是字典中多了一个条目。
苹果的孩子们又一次失败了。
编辑 2016 年和 iOS 8/9
自从我发布这个问题以来,我一直试图一劳永逸地解决这个问题。每当我进行谷歌搜索时,我总是会回到这个问题。
在某个地方,iOS 引入了一个“网络存档”概念,用于将 HTML 放在粘贴板上。它在任何地方都没有很好的记录。我在这里找到了一个早于我的问题的答案,所以这有点令人沮丧,但它确实有效。我已对其进行了更新,以利用 iOS 更高版本中的内置 base64 编码。它是这样的:
NSMutableDictionary * contents = [NSMutableDictionary dictionaryWithCapacity:6];
NSString * htmlText = @"<h1>A Heading</h1><p>A paragraph.</p>"
//... put other formats in the dictionary, then...
NSData * data = [htmlText dataUsingEncoding:NSUTF8StringEncoding];
NSString * base64encodedString = [data base64EncodedStringWithOptions:0];
NSString * webArchiveString = [NSString stringWithFormat:
@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">"
"<plist version=\"1.0\">"
"<dict>"
"<key>WebMainResource</key>"
"<dict>"
"<key>WebResourceData</key>"
"<data>%@</data>"
"<key>WebResourceFrameName</key>"
"<string></string>"
"<key>WebResourceMIMEType</key>"
"<string>text/html</string>"
"<key>WebResourceTextEncodingName</key>"
"<string>UTF-8</string>"
"<key>WebResourceURL</key>"
"<string>about:blank</string>"
"</dict>"
"</dict>"
"</plist>", base64encodedString];
[contents setObject:webArchiveString forKey:@"Apple Web Archive pasteboard type"];
UIPasteboard * pasteboard = [UIPasteboard generalPasteboard];
pasteboard.items = [NSArray arrayWithObject:contents];