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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top