Хранение NSArray в UIPasteboard - PullRequest
5 голосов
/ 06 февраля 2012

У меня есть несколько текстовых файлов, которые я хочу передать между двумя приложениями.(т.е. бесплатные и платные версии одного и того же приложения).

Я использую 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

Ответы [ 2 ]

7 голосов
/ 21 марта 2012

Я столкнулся с той же проблемой, и я думаю, что семейство методов 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 не вызывался больше, как только Apple исправит их ошибку

0 голосов
/ 06 мая 2015

Начиная с 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
    }
}
...