13

問題:

バイナリ ファイル コンテンツのリストで、標準の MIME タイプ (または UTI タイプ) に組み込みの iOS アイコンを使用できるようにしたいと考えています。

バックグラウンド:

新しい (3.2 以降の) ドキュメント アーキテクチャの使用を検討しましたが、UIDocumentInteractionController を使用すると、実際のバイナリが既にローカル デバイス上にあるという前提があるようです。

私の場合、リモートサーバーからのファイルリストがあり、リモートファイルの MIME タイプ、名前、タイトルなどを知っているので、アイコン付きのファイルリストを表示したいだけです (実際のバイナリは必要に応じてのみ読み込まれます)。

サーバーから取得したメタデータには、バイナリの適切な MIME タイプが含まれているため、理論的には、タイプに基づいてシステム アイコンを取得したいだけです。

回避策はありますか?

概念実証として次の「ハック」を試してみましたが、うまくいくようですが、これは最善の方法ではないようです...

//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

UIDocumentInteractionControllerURLを指定せずに作成できます。クラスのヘッダーは、アイコンが設定されている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 でも機能しませんでした。に を指定する必要がありますNSURLUIDocumentInteractionController、その 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 と png を使用すると、plist を読み取って正しい png を表示するロジックを作成するだけで済みます。

于 2011-05-27T11:55:13.773 に答える