2008-09-10 6 views
5

Gibt es eine Möglichkeit, ein NSPasteboard für das zu filtern, was die Quellanwendung speziell deklariert hat?Unfiltering NSPasteboard

Ich versuche, Pasteboard-Daten in meiner Anwendung zu serialisieren. Wenn eine andere Anwendung eine RTF-Datei auf einem Pasteboard platziert und ich dann nach den verfügbaren Typen frage, erhalte ich elf verschiedene Varianten dieser RTF, alles von der ursprünglichen RTF über einfache Zeichenfolgen bis hin zu Dyn. * - Werten.

Das Speichern aller Daten in einem Plist oder Rohdaten auf der Festplatte ist normalerweise kein Problem, da es ziemlich klein ist. Wenn jedoch ein Bild mit einer beträchtlichen Größe auf der Montagefläche platziert wird, kann die Ausgabe zigfach sein größer als die Quelldaten (mit mehreren Varianten von TIFF- und PICT-Daten, die durch Filtern verfügbar gemacht werden).

Ich möchte nur sparen, was die ursprüngliche App zur Verfügung gestellt, wenn möglich.


John, Sie sind weit aufmerksamer als ich selbst oder der Herr mit denen ich arbeite, wer getan Mac-Programmierung, da die Dinosaurier die Erde bevölkerten. Keiner von uns hat jemals den Text bemerkt, den Sie hervorgehoben haben ... und ich habe keine Ahnung warum. Ich habe offensichtlich zu lange mit dem Problem angefangen.

Und während ich Ihre Antwort als die richtige Antwort akzeptiert, beantwortet es nicht genau meine ursprüngliche Frage. Nach was ich suchte, war eine Weise, Aromen zu identifizieren, die andere Aromen werden können, einfach indem sie sie auf dem Pasteboard AND setzten, um zu wissen, welche dieser Typen ursprünglich vom Anbieter angeboten wurden. Während des Gehens erhält die Typenliste die bevorzugte Reihenfolge für die Anwendung, die sie zur Verfügung gestellt hat, sie sagt mir nicht, welche ich ignorieren kann, da sie neu erstellt werden, wenn ich die Pappe später auffülle.

Ich bin zu dem Schluss gekommen, dass es keinen "guten" Weg gibt, dies zu tun. [NSPasteboard declaredTypesFromOwner] wäre fabelhaft, aber es existiert nicht.

Antwort

4

-[NSPasteboard types] alle verfügbaren Typen für die Daten in der Zwischenablage zurück, aber es sollte ihnen "in the order they were declared."

Die Dokumentation für -[NSPasteboard declareTypes:owner:] Rückkehr sagt, dass "the types should be ordered according to the preference of the source application."

A ordnungsgemäß umgesetzt Pappe Eigentümer sollte daher erklären die reichste Darstellung des Inhalts (wahrscheinlich der ursprüngliche Inhalt) als erster Typ; so eine vernünftige Einzel Darstellung sollte sein:

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

Sie können in der Lage sein, einige Verwendung von +[NSPasteboard typesFilterableTo:] zu bekommen. Ich malte ein Snippet wie folgt aus:

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

Ich bin nicht sicher, wie effektiv diese bei Kommissionierung gute Art sein würde, aber.