5

我有几个要在 2 个应用程序之间传输的文本文件。(即同一应用程序的免费和付费版本)。

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

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

当我用这种粘贴板类型读/写 NSStrings 时,它工作正常。

我搜索了 Apple 文档等,看看是否有我应该为 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 返回。

任何帮助将不胜感激。谢谢斯蒂芬C

4

2 回答 2

7

我遇到了同样的问题,我认为 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];
}

希望这会成功,因此一旦苹果修复了他们的错误,if 中的代码就不会再被调用

于 2012-03-21T15:35:02.750 回答
0

在 iOS 8.3 中,UIPasteboard 仍然存在这个错误。我为 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
    }
}
于 2015-05-05T21:02:14.550 回答