9 Stimmen

Ein intelligenter Weg, um erlaubte Dateitypen aus plist abzurufen

Szenario:

Ich möchte die zulässigen Dateitypen (Inhaltstypen) in der Info.plist Datei meiner Cocoa-Anwendung. Daher habe ich sie wie im folgenden Beispiel gezeigt hinzugefügt.

# Extract from Info.plist
[...]
<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>public.png</string>
        <key>CFBundleTypeIconFile</key>
        <string>png.icns</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>LSIsAppleDefaultForType</key>
        <true/>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.png</string>
        </array>
    </dict>
[...]

Außerdem erlaubt meine Anwendung das Öffnen von Dateien mit einem NSOpenPanel . Das Panel ermöglicht die Einstellung der zulässigen Dateitypen über den folgenden Selektor: setAllowedFileTypes: . その In der Dokumentation heißt es, dass UTI verwendet werden kann .

Der Dateityp kann eine gewöhnliche Dateierweiterung oder eine UTI sein.


Eine maßgeschneiderte Lösung:

Ich habe die folgende Hilfsmethode geschrieben, um die UTI aus der Datei Info.plist Datei.

/**
    Returns a collection of uniform type identifiers as defined in the plist file.
    @returns A collection of UTI strings.
 */
+ (NSArray*)uniformTypeIdentifiers {
    static NSArray* contentTypes = nil;
    if (!contentTypes) {
        NSArray* documentTypes = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDocumentTypes"];
        NSMutableArray* contentTypesCollection = [NSMutableArray arrayWithCapacity:[documentTypes count]];
        for (NSDictionary* documentType in documentTypes) {
            [contentTypesCollection addObjectsFromArray:[documentType objectForKey:@"LSItemContentTypes"]];
        }
        contentTypes = [NSArray arrayWithArray:contentTypesCollection];
        contentTypesCollection = nil;
    }
    return contentTypes;
}

Anstelle von [NSBundle mainBundle] auch CFBundleGetInfoDictionary(CFBundleGetMainBundle()) verwendet werden können.


Fragen:

  1. Kennen Sie eine intelligentere Methode, um die Informationen zum Inhaltstyp zu extrahieren? aus dem Info.plist Datei? Gibt es eine in Cocoa eingebaute Funktion?
  2. Wie gehen Sie mit der Definition von Ordnern um, die Folgendes enthalten können enthalten können, z.B. public.folder ?

Nota:
Bei meinen Recherchen fand ich diesen Artikel sehr informativ: Vereinfachung der Datenverarbeitung mit einheitlichen Typbezeichnungen .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X