2012-02-06 1 views
5

J'ai plusieurs fichiers texte que je veux transférer entre 2 applications. (c'est-à-dire des versions gratuites et payantes de la même application). J'utilise UIPasteboard pour ce faire. Le contenu des fichiers est conservé en mémoire sous NSArrays, et je veux donc copier ces tableaux NSArrays dans la table de montage (version allégée), et les lire depuis la table de montage (version complète).Stockage de NSArray dans UIPasteboard

Pour une raison quelconque, les données ne peuvent pas être lues depuis le carton. Les données sont renvoyées en tant qu'objet NSData, plutôt que NSArray, ce qui signifie, je pense, qu'il n'est pas dans le format requis pour le type de tableau que j'utilise, qui est "public.utf8-plain-text".

Lorsque je lis ou écris des NSStrings avec ce type de tableau, cela fonctionne correctement. J'ai cherché dans les documents Apple, etc, pour voir s'il y avait un type différent que je devrais utiliser pour NSArrays, (ou d'autres objets de liste de propriétés), mais j'ai dessiné un blanc.

Ecrire à la table de montage: (Dans le pDataOutput suivant est un tableau de chaînes, le contenu du fichier):

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

lecture de la table de montage:

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

Les rendements ci-dessus:

Comme mentionné ci-dessus, il renvoie les données correctement comme NSStrings s'il est écrit en tant que NSStrings.

Toute aide serait grandement appréciée. Merci Stephen C

Répondre

7

J'ai rencontré le même problème et je pense que la famille de méthodes valueForPasteboardType est cassée et renvoie toujours NSData. Voici ma solution:

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

nous espérons que cela fera si le code dans le cas ne se dit plus une fois Apple corrige leur bug

0

Comme d'iOS 8.3, UIPasteboard a encore ce bug. J'ai écrit une extension pour UIPasteboard pour gérer ceci:

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