objective-c – ‘registerForDraggedTypes:’仅限音频

objective-c – ‘registerForDraggedTypes:’仅限音频,第1张

概述我正在尝试编写一个小的 Cocoa应用程序.它涉及一个NSView,我希望用户能够拖动音频文件(例如,来自Finder).但是,我不知道如何只允许将音频文件放入NSView. 我设法做到这一点,认为这将工作: - (id)initWithCoder:(NSCoder *)coder{ self=[super initWithCoder:coder]; if ( self ) { 我正在尝试编写一个小的 Cocoa应用程序.它涉及一个NSVIEw,我希望用户能够拖动音频文件(例如,来自Finder).但是,我不知道如何只允许将音频文件放入NSVIEw.

我设法做到这一点,认为这将工作:

- (ID)initWithCoder:(NSCoder *)coder{    self=[super initWithCoder:coder];    if ( self ) {        Nsstring *myType = (__brIDge Nsstring *)(UTTypeCreatePreferredIDentifIErForTag(kUTTagClassNSPboardType,kUTTypeAudio,NulL));        [self registerForDraggedTypes: [NSArray arrayWithObject:myType]];    }    return self;}

上面的代码似乎不允许任何文件被放入NSVIEw.我假设这是因为myType对于registerForDraggedTypes无效.

您可以提供的任何帮助将不胜感激.提前致谢.

解决方法 注册kUTTypeAudio等类型不会注册拖动的文件;它注册拖动音频.它可能适用于接受从其他应用程序拖入的任何类型的音频,但不适用于接受文件.

您需要注册类型kUTTypefileURL.执行此 *** 作后,用户拖入的任何文件都将点亮您的拖动目标方法.在这个阶段没有办法说“我想要文件,但只有一些文件”.

作为拖动目标,您需要验证拖动(在draggingEntered :)中.您可以在此处测试是否有任何文件是音频文件.您可以选择三种方法:

>使用元数据框架获取每个文件的内容类型.对于没有Spotlight索引的卷上的任何文件,预计会失败.
>使用Launch Services确定与给定文件扩展名对应的内容类型.任何没有文件扩展名的文件都会失败;应该工作只要没有文件扩展名是模糊的(音频,AFAIK不是问题,但对于某些扩展可能是一个问题,如“dat”).
>尝试使用基础音频API /库解释每个文件,并查看它是否成功.

如果您获得其中一个文件的内容类型(UTI),则必须查看它是否是您可以处理的类型之一.

>如果您只是使用NSSound播放音频,请使用[NSSound soundUnfilteredTypes].这将返回一个UTI数组,所以你已经完成了;您可以简单地将传入的UTI与此数组中的UTI进行比较(使用UTTypeEqual).
>如果您正在使用音频文件服务(或下一个更高级别的API,ExtAudiofile)来读取每个文件,请使用AudiofileGetGlobalinfo获取类型代码列表,然后使用UTTypeCreatePreferredIDentifIErForTag将每个文件从OSType转换为UTI.
>如果您正在使用其他库,您只需要查看它提供的内容,以评估它支持的类型.

*当且仅当检查传入类型是否符合您的任何注册类型而不是相等.如果严格测试它们与您注册类型的相同性,则需要注册您可以处理的特定音频类型.

总结

以上是内存溢出为你收集整理的objective-c – ‘registerForDraggedTypes:’仅限音频全部内容,希望文章能够帮你解决objective-c – ‘registerForDraggedTypes:’仅限音频所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1002110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存