Objective c 具有自定义文件格式的registerForDraggedTypes

Objective c 具有自定义文件格式的registerForDraggedTypes,objective-c,cocoa,Objective C,Cocoa,开发人员文档没有提供RegisterForDragedTypes方法的完整描述。例如,我希望我的应用程序只允许访问“*.abc”文件。如何执行此操作?如果要将文件拖到视图中,应注册NSFilenamesPboardType类型。如果您只想接受某些文件名,可以在performdragooperation:的实现中执行。比如: - (BOOL)performDragOperation:(id < NSDraggingInfo >)sender { NSArray *dragged

开发人员文档没有提供RegisterForDragedTypes方法的完整描述。例如,我希望我的应用程序只允许访问“*.abc”文件。如何执行此操作?

如果要将文件拖到视图中,应注册
NSFilenamesPboardType
类型。如果您只想接受某些文件名,可以在
performdragooperation:
的实现中执行。比如:

- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender {
    NSArray *draggedFilenames = [[sender draggingPasteboard] propertyListForType:NSFilenamesPboardType];
    if ([[[draggedFilenames objectAtIndex:0] pathExtension] isEqual:@"abc"])
        return YES;
    else
        return NO;
}
-(BOOL)执行跟踪操作:(id)发送方{
NSArray*draggedFilenames=[[sender draggingPasteboard]propertyListForType:nsFileNamesPardType];
如果([[[DragedFileNames objectAtIndex:0]路径扩展]isEqual:@“abc”])
返回YES;
其他的
返回否;
}

只查看第一条路径是不好的做法,因为当用户拖动多个文件时,这会导致行为不一致。如果第一个文件是.abc文件,则返回
YES
,而不管是否有其他文件;相反,如果第一个文件不是.abc文件,则返回
NO
,即使其他文件中有.abc文件。此外,你也在对案例进行敏感的比较;例如,您将无法匹配.ABC文件。最好是在
路径扩展名
s中循环,并使用
区分大小写比较:
查找.abc文件(并决定是否要返回
,如果拖动中有任何非.abc文件)。是。使用路径扩展名来决定要处理哪些文件也是个坏主意;最好使用统一的类型标识符。这段代码只是一个起点。