Não filtrando NSPasteboard
-
09-06-2019 - |
Pergunta
Existe uma maneira de remover a filtragem de um NSPasteboard para o que o aplicativo de origem declarou especificamente que forneceria?
Estou tentando serializar dados do Pasteboard em meu aplicativo.Quando outro aplicativo coloca um arquivo RTF em uma área de transferência e peço os tipos disponíveis, obtenho onze sabores diferentes do referido RTF, tudo, desde o RTF original até strings simples e valores dyn.*.
Salvar todos esses dados em um plist ou dados brutos no disco geralmente não é um problema, pois é muito pequeno, mas quando uma imagem de qualquer tamanho considerável é colocada na área de trabalho, a saída resultante pode ser dezenas de vezes maior que a fonte dados (com vários tipos de dados TIFF e PICT disponibilizados por meio de filtragem).
Gostaria apenas de poder salvar o que o aplicativo original disponibilizou, se possível.
John, você é muito mais observador do que eu ou o cavalheiro com quem trabalho, que faz programação para Mac desde que os dinossauros habitaram a Terra.Nenhum de nós percebeu o texto que você destacou...e não tenho ideia do porquê.Aparentemente, estou começando muito tempo com o problema.
E embora eu tenha aceitado sua resposta como correta, ela não responde exatamente à minha pergunta original.O que eu procurava era uma forma de identificar sabores que podem se tornar outros sabores simplesmente colocando-os na cartolina E saber quais desses tipos foram originalmente oferecidos pelo provedor.Embora percorrer a lista de tipos me forneça a ordem preferida para o aplicativo que os forneceu, ela não me dirá quais posso ignorar com segurança, pois eles serão recriados quando eu recarregar a área de transferência mais tarde.
Cheguei à conclusão de que não existe uma maneira "boa" de fazer isso. [NSPasteboard declaredTypesFromOwner]
seria fabuloso, mas não existe.
Solução
-[NSPasteboard types]
retornará todos os tipos disponíveis para os dados na área de transferência, mas deverá retorná-los "na ordem em que foram declarados."
A documentação para -[NSPasteboard declareTypes:owner:]
diz que "os tipos devem ser ordenados de acordo com a preferência da aplicação fonte."
Um proprietário de cartão devidamente implementado deveria, portanto, declarar a representação mais rica do conteúdo (provavelmente o conteúdo original) como o primeiro tipo;portanto, uma representação única razoável deveria ser:
[pb dataForType:[[pb types] objectAtIndex:0]]
Outras dicas
Você pode conseguir algum uso +[NSPasteboard typesFilterableTo:]
.Estou imaginando um trecho como este:
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];
}
No entanto, não tenho certeza de quão eficaz isso seria na escolha de bons tipos.