UIPasteboardにNSArrayを格納する

2つのAppsの間で転送したいテキストファイルがいくつかあります。 (つまり、同じアプリの無料版と有料版)。

私はこれを行うためにUIPasteboardを使用しています。ファイルの内容はNSArraysとしてメモリに保持されているので、これらのNSArraysをペーストボード(liteバージョン)にコピーし、ペーストボード(フルバージョン)から読み込みたいと思います。

何らかの理由で、データをペーストボードから読み取ることができません。 NSArrayではなくNSDataオブジェクトとしてデータが返されています。これは、私が使用しているペーストボードタイプ(「public.utf8-plain-text」)の必須フォーマットではないと考えています。

このペーストボードタイプでNSStringを読み書きするとうまくいきます。

私は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

5

2 答え

私は同じ問題に遭遇し、メソッドの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のコードがもう呼び出されないようになります

7
追加された

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
    }
}
0
追加された