在UIPasteboard中存储NSArray

问题描述:

我有几个文本文件,我想在2个应用程序之间传输。 (即同一个App的免费和付费版本)。在UIPasteboard中存储NSArray

我正在使用UIPasteboard来做到这一点。这些文件的内容作为NSArrays保存在内存中,因此我想将这些NSArrays复制到粘贴板(lite版本),并从粘贴板(完整版)读取它们。

由于某些原因无法从纸板读回数据。数据将作为NSData对象返回,而不是NSArray,我认为这意味着它不是我使用的“public.utf8-plain-text”所用的粘贴板类型所需的格式。

当我与这个纸板类型读/写NSString的,它工作正常。

我通过苹果文档等搜索,看是否有不同的类型,我应该使用的NSArrays,(或其他属性列表对象),但一无所获。

写入粘贴板:(在下面的pDataOutput是一个字符串数组,文件的内容):

NSMutableArray *lArrayCopy = [gGlobalData.cPasteBoard.items mutableCopy]; 
[lArrayCopy replaceObjectAtIndex:pDataFileIdx 
        withObject:[NSDictionary dictionaryWithObject:pDataOutput 
                 forKey:@"public.utf8-plain-text"]]; 
gGlobalData.cPasteBoard.items = lArrayCopy; 
[lArrayCopy release]; 

从剪贴板读:

NSArray *lPBItems = [pPasteBoard valuesForPasteboardType:@"public.utf8-plain-text" 
               inItemSet:nil]; 
NSLog(@"PB Items = NSArray of count %d", lPBItems.count); 

上述返回:

PB Items = NSArray of count 0 

如上所述,如果作为NSStrings写入,它将以NSStrings的形式正确返回数据。

任何帮助将非常感激。 谢谢 Stephen C

我遇到了同样的问题,我认为valueForPasteboardType方法家族被打破,总是返回NSData。 这里是我的解决方案:

NSArray * lArrayFromPasteBoard = [pPasteBoard valueForPasteboardType:@"com.my.custom.type"]; 
if ([lArrayFromPasteBoard isKindOf:[NSData class]]) 
{ 
    lArrayFromPasteBoard = [[NSPropertyListSerialization propertyListWithData:(NSData*)lArrayFromPasteBoard options:0 format:0 error:0]; 
} 

希望这将使它这样的,如果将一次苹果修复了错误

随着iOS 8.3版本的不是得到了叫,UIPasteboard仍然有这个bug的代码。我写了一个扩展UIPasteboard来处理这个问题:

extension UIPasteboard { 
    func arrayForPasteboardType(pasteboardType: String) -> NSArray? { 
     switch valueForPasteboardType(pasteboardType) { 
     case let array as NSArray: 
      return array 
     case let data as NSData: 
      if let array = NSPropertyListSerialization.propertyListWithData(data, options: 0, format: nil, error: nil) as? NSArray { 
       return array 
      } 
     default: 
      break 
     } 

     return nil 
    } 
}