在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
}
}