2014-02-23 47 views
1

我尝试三种类型的对象之间,以确定:如何检测纸板项目类型

  1. ,如果它是一个文件
  2. 的URL。如果它是一个目录
  3. ,如果它的URL是一个简单的字符串

到目前为止,我只是这个代码,这是行不通的!

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的第一个对象,并尝试调用“类型”属性,我得到一个崩溃!

回答

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; 

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

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

我用这样的事情在我的项目之一:

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

谢谢你的回答,但我一直在清理这两页这几天......还没有运气呢!你从哪里得到这份清单? –

+0

列表来自我的答案中的链接(第一行,第二个链接)。我编辑了答案一点,如果它有帮助 – Merlevede

0

types是用来告诉你什么是可以从纸板上NSPasteboard的方法。所以,你不应该把它从你从纸板上拿回来的物品上调用它。

如果您要请求多个类类型,请遍历响应并检查每个项目的类类型,然后决定如何与其交互。

或者,决定哪种类型的数据最有用,并向粘贴板发出单独的类型请求。如果你得到一个结果,使用它,继续,如果没有,尝试下一个最有用的类类型。看看使用canReadObjectForClasses:options:使这更容易。

+0

好吧,我刚刚检查。 NSPasteboardItem类有一个方法可用...我将尝试您提出的其他想法! –

+0

返回的项目符合'NSPasteboardReading'协议,但它没有'types'方法。 – Wain