使用CFBundleDocumentTypes过滤拖放NSView

时间:2011-11-28 23:14:04

标签: objective-c cocoa drag-and-drop dry info.plist

我有一个拖放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>

我已经能够在NSView的draggingEntered方法中验证丢弃接受度,但我希望能够运行Info.plist的{​​{1}}条目,而不是复制所有条目这种方法。我该怎么做才能使我的视图接受CFBundleDocumentTypes条目中列出的完全相同的文件?

1 个答案:

答案 0 :(得分:1)

只需向您的论坛索取信息:

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

这将返回一个字典数组,每个字典对应一种文件类型,您可以从中轻松提取其他信息:

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

您可以将此功能与-documentClassForType:的{​​{1}}方法结合使用。这会将NSDocumentController CFBundleTypeName键的值作为类型。