2008-09-10 8 views
5

¿Hay alguna forma de eliminar un filtro de una NSPasteboard por lo que la aplicación de origen declaró específicamente que proporcionaría?NSFileboard de filtro 0

Estoy tratando de serializar los datos del cartón en mi aplicación. Cuando otra aplicación coloca un archivo RTF en una mesa de trabajo y luego pregunto por los tipos disponibles, obtengo once sabores diferentes de dicho RTF, todo desde el RTF original hasta cadenas simples hasta valores din *.

Guardar todos esos datos en un plist o datos sin formato en el disco no suele ser un problema ya que es bastante pequeño, pero cuando se coloca una imagen de un tamaño considerable en el cartón, el resultado puede ser decenas de veces más grande que la fuente de datos (con múltiples sabores de datos TIFF y PICT que están disponibles a través del filtrado).

Me gustaría simplemente poder guardar lo que la aplicación original puso a disposición si es posible.


John, que son mucho más observador que yo mismo o el caballero que trabajo que ha estado haciendo la programación Mac desde que los dinosaurios vagaban por la tierra. Ninguno de nosotros notó el texto que resaltaste ... y no tengo idea de por qué. Comenzando demasiado tiempo en el problema, al parecer.

Y aunque acepté su respuesta como la respuesta correcta, no responde exactamente a mi pregunta original. Lo que estaba buscando era una forma de identificar los sabores que pueden convertirse en otros sabores simplemente colocándolos en el cartón y para saber cuáles de estos tipos fueron originalmente ofrecidos por el proveedor. Mientras recorro la lista de tipos, obtendré el pedido preferido para la aplicación que los proporcionó, no me dirá cuáles puedo ignorar con seguridad, ya que se volverán a crear cuando vuelva a llenar la mesa de trabajo más tarde.

He llegado a la conclusión de que no hay una "buena" manera de hacerlo. [NSPasteboard declaredTypesFromOwner] sería fabuloso, pero no existe.

Respuesta

4

-[NSPasteboard types] devolverá todos los tipos disponibles para los datos en el portapapeles, pero ellos deben volver "in the order they were declared."

La documentación para -[NSPasteboard declareTypes:owner:] dice que "the types should be ordered according to the preference of the source application."

El dueño de una mesa de trabajo aplique en forma adecuada, por lo tanto, declarar la la representación más rica del contenido (probablemente el contenido original) como el primer tipo; por lo que una sola representación razonable debería ser:

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

Usted puede ser capaz de obtener un cierto uso de +[NSPasteboard typesFilterableTo:]. Estoy imaginando un fragmento de esta manera:

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 estoy seguro de la eficacia de este sería en escoger buenos tipos, sin embargo.