Фильтр перетаскивания NSViews с CFBundleDocumentTypes - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть Drag / Drop NSView, который должен принимать те же типы файлов и расширения, которые я перечислил в моем plist под ключом CFBundleDocumentTypes. Приложение принимает любой тип видеофайлов, папок и несколько расширений файлов, которые не распознаются типом public.movie.

(довольно длинный) список CFBundleDocumentTypes:

    <key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>Folder</string>
        <key>CFBundleTypeOSTypes</key>
        <array>
            <string>fold</string>
        </array>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeName</key>
        <string>Movies</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.movie</string>
        </array>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>flv</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Flash Video File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>ram</string>
            <string>rm</string>
            <string>rmvb</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>RealPlayer Media Files</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>vob</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>VOB File (DVD Video)</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>ogm</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Ogg MPEG-4 Video File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>ogv</string>
        </array>
        <key>CFBundleTypeMIMETypes</key>
        <array>
            <string>video/ogg</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Ogg Video File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>axv</string>
        </array>
        <key>CFBundleTypeMIMETypes</key>
        <array>
            <string>video/annodex</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Annodex Video File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>avi</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>AVI container</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>mov</string>
            <string>moov</string>
            <string>qt</string>
        </array>
        <key>CFBundleTypeMIMETypes</key>
        <array>
            <string>video/quicktime</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Apple QuickTime container</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>divx</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>DivX file</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>dv</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>DV file</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>wmv</string>
            <string>wm</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Windows Media Video</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>mpg</string>
            <string>mpeg</string>
            <string>mpeg1</string>
            <string>mpeg2</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>multiplexed MPEG-1/2</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>m1v</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>MPEG-1 Video File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>ts</string>
            <string>m2ts</string>
            <string>mts</string>
            <string>mt2s</string>
        </array>
        <key>CFBundleTypeMIMETypes</key>
        <array>
            <string>video/mp2t</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>MPEG-2 Transport Stream</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>m2v</string>
            <string>mpv</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>MPEG-2 Video File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>mp4</string>
            <string>mpeg4</string>
            <string>m4v</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>MPEG-4 File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>3gp</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>3GPP File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>mkv</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Matroska Video File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>webm</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>WebM Video File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
    </dict>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>nuv</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>NuppleVideo File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>LSTypeIsPackage</key>
        <false/>
        <key>NSPersistentStoreTypeKey</key>
        <string>Binary</string>
    </dict>
</array>

Я уже в состоянии проверить принятие отбрасывания в моем методе draggingEntered моего NSView, но я хочу иметь возможность проходить через Info.plist записи для CFBundleDocumentTypes вместо дублирования всех записей в этом методе. Как я могу сделать это, чтобы мое представление принимало те же файлы, что перечислены в записи CFBundleDocumentTypes?

1 Ответ

1 голос
/ 29 ноября 2011

Просто запросите информацию в вашем комплекте:

NSArray* documentTypes = [[[NSBundle mainBundle] infoDictionary]
                                    objectForKey:@"CFBundleDocumentTypes"];

Это вернет массив словарей, по одному для каждого из типов файлов, из которого вы можете легко извлечь другую информацию:

for(NSDictionary* docInfo in documentTypes)
{
    NSArray* fileExtensions = [docInfo objectForKey:@"CFBundleTypeExtensions"];
    //do something with this info
}

Вы можете использовать это вместе с -documentClassForType: методом NSDocumentController.Это берет значение от клавиши CFBundleTypeName Info.plist как тип.

...