2008-09-10 8 views
5

Existe-t-il un moyen de ne pas filtrer un NSPasteboard pour ce que l'application source a déclaré qu'elle fournirait? Je tente de sérialiser les données de la table de montage dans mon application. Lorsqu'une autre application place un fichier RTF sur une table de montage et que je demande ensuite les types disponibles, j'obtiens onze goûts différents de ce RTF, tout ce qui va du RTF original aux chaînes simples en passant par les valeurs dyn. *.Filtrage de NSPasteboard

La sauvegarde de toutes ces données dans un plist ou des données brutes sur le disque ne pose généralement pas de problème car elle est assez petite, mais lorsqu'une image de taille importante est placée sur le carton, la sortie peut être des dizaines de fois plus grande que les données sources (avec plusieurs variantes de données TIFF et PICT disponibles via le filtrage). Je voudrais juste pouvoir enregistrer ce que l'application originale a rendu disponible si possible.


John, vous êtes beaucoup plus attentif que moi-même ou le monsieur avec qui je travaille qui a été fait la programmation Mac depuis les dinosaures parcouraient la terre. Aucun d'entre nous n'a jamais remarqué le texte que vous avez mis en évidence ... et je ne sais pas pourquoi. En commençant trop longtemps au problème, apparemment.

Et même si j'ai accepté votre réponse comme réponse correcte, elle ne répond pas exactement à ma question initiale. Ce que je cherchais était un moyen d'identifier les saveurs qui peuvent devenir d'autres saveurs simplement en les plaçant sur le carton et pour savoir lesquels de ces types étaient initialement offerts par le fournisseur. En marchant, la liste des types me donnera l'ordre préféré pour l'application qui les a fournis, elle ne me dira pas lesquels je peux ignorer en toute sécurité car ils seront recréés quand je remplirai le carton plus tard. Je suis arrivé à la conclusion qu'il n'y a pas de "bonne" façon de le faire. [NSPasteboard declaredTypesFromOwner] serait fabuleux, mais il n'existe pas.

Répondre

4

-[NSPasteboard types] retournera tous les types disponibles pour les données du presse-papiers, mais il doit les retourner "in the order they were declared."

La documentation -[NSPasteboard declareTypes:owner:] dit que "the types should be ordered according to the preference of the source application."

Un propriétaire de carton correctement mis en œuvre devrait, par conséquent, déclarer la représentation la plus riche du contenu (probablement le contenu original) en tant que premier type; donc une représentation unique raisonnable devrait être:

[pb dataForType:[[pb types] objectAtIndex:0]] 
0

Vous pouvez être en mesure d'obtenir une certaine utilisation de +[NSPasteboard typesFilterableTo:]. Je suis un extrait imaginer comme ceci:

NSArray *allTypes = [pb types]; 
NSAssert([allTypes count] > 0, @"expected at least one type"); 

// We always require the first declared type, as a starting point. 
NSMutableSet *requiredTypes = [NSMutableSet setWithObject:[allTypes objectAtIndex:0]]; 

for (NSUInteger index = 1; index < [allTypes count]; index++) { 
    NSString *aType = [allTypes objectAtIndex:index]; 
    NSSet *filtersFrom = [NSSet setWithArray:[NSPasteboard typesFilterableTo:aType]]; 

    // If this type can't be re-created with a filter we already use, add it to the 
    // set of required types. 
    if (![requiredTypes intersectsSet:filtersFrom]) 
     [requiredTypes addObject:aType]; 
} 

Je ne sais pas comment cela serait efficace à choisir de bons types, cependant.