Подтвердить что ты не робот

Использование встроенных значков для типа mime или типа UTI в iOS

Проблема:

Я хотел бы иметь возможность использовать встроенные значки iOS для стандартных типов mime (или типов UTI) в моем списке содержимого двоичного файла.

История:

Я изучил использование новой архитектуры документов (начиная с версии 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;
4b9b3361

Ответ 1

Вы можете создать UIDocumentInteractionController без указания URL-адреса. Заголовок для класса говорит, что значки определяются name, если установлено, URL иначе.

UIDocumentInteractionController* docController = [[UIDocumentInteractionController alloc] init];
docController.name = @"foo.dat";
NSArray* icons = docController.icons;
// Do something with icons
...
[docController release];

Ответ 2

Я попробовал решение 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;

Ответ 3

Итак, мы говорим о хаках, а? Я сделал это, сделав несколько плохих вещей, но он работает... Я скопировал значки из /system/library/frameworks/QuickLook.framework и добавил в свой проект. Внутри этой же папки есть некоторые списки свойств, которые связывают между UTI/extension/mime-type с png файлом. С помощью plist и png все, что вам нужно сделать, это сделать логику, чтобы прочитать plists и показать правильную png.