13

问题:

我希望能够在我的二进制文件内容列表中使用标准 mime 类型(或 UTI 类型)的内置 iOS 图标。

背景:

我已经研究过使用新的(自 3.2 起)文档架构,但使用 UIDocumentInteractionController 似乎假设实际的二进制文件已经在本地设备上。

在我的情况下,我有一个来自远程服务器的文件列表,并且知道远程文件的 mime 类型、名称、标题等,所以我只想显示一个带有图标的文件列表(实际的二进制文件仅根据需要加载)。

我从服务器获得的元数据包含二进制文件的正确 mime 类型,所以理论上我只想根据类型获取系统图标。

解决问题?

我已经尝试过以下“hack”作为概念证明,它似乎有效,但这似乎不是最好的方法......

//Need to initialize this way or the doc controller doesn't work
NSURL*fooUrl = [NSURL URLWithString:@"file://foot.dat"];
UIDocumentInteractionController* docController = [[UIDocumentInteractionController interactionControllerWithURL:fooUrl] retain];

UIImage* thumbnail = nil;
//Need to convert from mime type to a UTI to be able to get icons for the document
NSString *uti = [NSMakeCollectable(UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (CFStringRef)self.contentType, NULL)) autorelease];

//Tell the doc controller what UTI type we want
docController.UTI = uti;

//The doc controller now seems to have icon(s) for the type I ask for...
NSArray* icons = docController.icons;
if([icons count] > 0) {
    thumbnail = [icons objectAtIndex:0];
}
return thumbnail;
4

3 回答 3

12

您可以创建一个UIDocumentInteractionController而不需要指定一个 URL。该类的标题表示图标由name是否设置确定,URL否则。

UIDocumentInteractionController* docController = [[UIDocumentInteractionController alloc] init];
docController.name = @"foo.dat";
NSArray* icons = docController.icons;
// Do something with icons
...
[docController release];
于 2012-06-20T11:54:20.397 回答
10

我尝试了Ben Lings 的解决方案,但它在 iOS6.1 的模拟器或我的 iPad3 上都不起作用。NSURL您需要向提供UIDocumentInteractionController,但该 URL 不需要存在。它的最后一个路径组件只需要具有您想要的扩展名。

以下代码对我有用

NSString *extension = @"pptx"; // or something else
NSString *dummyPath = [@"~/foo" stringByAppendingPathExtension:extension]; // doesn't exist
NSURL *URL = [NSURL fileURLWithPath:dummyPath];
UIDocumentInteractionController *documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:URL];
NSArray *systemIconImages = documentInteractionController.icons;

return systemIconImages;
于 2013-02-14T17:46:50.290 回答
1

所以我们在谈论黑客,嗯?我通过做一些坏事来做到这一点,但它正在工作......我从 /system/library/frameworks/QuickLook.framework 复制了图标并添加到我的项目中。在同一个文件夹中,有一些属性列表,它们在 UTI/extension/mime-type 与 png 文件之间建立了链接。使用 plist 和 pngs,您所要做的就是制定一个逻辑来读取 plists 并显示正确的 png。

于 2011-05-27T11:55:13.773 回答