2012-02-06 8 views
5

Ho diversi file di testo che desidero trasferire tra 2 app. (es. versioni gratuite e a pagamento della stessa app).Memorizzazione di NSArray in UIPasteboard

Sto usando UIPasteboard per fare questo. I contenuti dei file sono conservati in memoria come NSArrays, quindi voglio copiare questi NSArrays nel pasteboard (versione lite) e leggerli dal pasteboard (versione completa).

Per qualche motivo, i dati non possono essere letti dal cartoncino. I dati vengono restituiti come un oggetto NSData, piuttosto che NSArray, che a mio avviso significa che non è nel formato richiesto per il tipo di cartoncino che sto usando, che è "public.utf8-plain-text".

Quando leggo/scrivo NSStrings con questo tipo di cartoncino, funziona perfettamente.

Ho cercato tra i documenti Apple, ecc., Per vedere se c'è un tipo diverso che dovrei usare per NSArrays (o altri oggetti di elenchi di proprietà), ma ho disegnato uno spazio vuoto.

Scrivendo al tavolo di montaggio: (Nel seguito pDataOutput è un array di stringhe, contenuto del file):

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

Lettura dal tavolo di montaggio:

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

I rendimenti di cui sopra:

PB Items = NSArray of count 0 

Come accennato in precedenza, restituisce i dati correttamente come NSStrings se scritti come NSStrings.

Qualsiasi aiuto sarebbe molto apprezzato. Grazie Stephen C

risposta

7

Ho incontrato lo stesso problema e credo che la famiglia valueForPasteboardType di metodi sono rotti e sempre tornare NSData. Ecco la mia soluzione:

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

speriamo che questo farà in modo che il codice nel caso non andranno più una volta chiamato mela fissa il bug

0

Come di iOS 8.3, UIPasteboard ha ancora questo bug. Ho scritto un'estensione per UIPasteboard per gestire questo:

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