如何检测粘贴板项目类型

时间:2014-02-23 20:08:15

标签: objective-c nspasteboard

我正在尝试识别三种类型的对象:

  1. 如果是文件的URL
  2. 如果是目录的URL
  3. 如果是简单的字符串
  4. 到目前为止,我只有这个代码,这不起作用!

    NSArray * classes = nil;
                classes = [[NSArray alloc] initWithObjects:[NSURL class],
                           [NSAttributedString class],[NSString class], nil];
    
                NSDictionary *options = [NSDictionary dictionary];
                NSArray * copiedItems = nil;
                copiedItems = [pb readObjectsForClasses:classes options:options];
    

    现在我尝试获取数组的第一个对象copiedItems并尝试调用“types”属性,然后我崩溃了!

2 个答案:

答案 0 :(得分:2)

检查herehere
您需要使用这些粘贴板类型,而不是您正在使用的粘贴板类型。

NSString *NSStringPboardType;
NSString *NSFilenamesPboardType;
NSString *NSPostScriptPboardType;
NSString *NSTIFFPboardType;
NSString *NSRTFPboardType;
NSString *NSTabularTextPboardType;
NSString *NSFontPboardType;
NSString *NSRulerPboardType;
NSString *NSFileContentsPboardType;
NSString *NSColorPboardType;
NSString *NSRTFDPboardType;
NSString *NSHTMLPboardType;
NSString *NSPICTPboardType;
NSString *NSURLPboardType;
NSString *NSPDFPboardType;
NSString *NSVCardPboardType;
NSString *NSFilesPromisePboardType;
NSString *NSMultipleTextSelectionPboardType;

网址有粘贴板类型。要区分文件和文件夹,您需要使用粘贴板数据实例化NSURL对象,并通过查询其属性来查明它是否是目录。

编辑: 您还需要考虑是否由您自己的应用程序或其他应用程序将粘贴板数据放在那里。如果它被其他应用程序放置,我不确定带有类的粘贴板类型是否可行。

我在我的一个项目中使用了这样的东西:

supportedTypes = // array with supported types, maybe from the list
NSString *type = [pasteboard availableTypeFromArray:supportedTypes];
NSData *data = [pasteboard dataForType:type];

答案 1 :(得分:0)

typesNSPasteboard上用于告诉您粘贴板可用内容的方法。因此,您不应该在从粘贴板返回的项目上调用它。

如果您要请求多个类类型,请迭代响应并检查每个项目的类类型,然后决定如何与它进行交互。

或者,确定哪种类类型的数据最有用,并向粘贴板发出单独的类类型请求。如果你得到一个结果,使用它并继续,如果没有,尝试下一个最有用的类类型。请使用canReadObjectForClasses:options:来简化此操作。