Frage

Gibt es eine Möglichkeit, ein NSPasteboard nach dem zu filtern, was die Quellanwendung ausdrücklich angegeben hat?

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

Das Speichern all dieser Daten in einer Plist oder in Rohdaten auf der Festplatte ist normalerweise kein Problem, da sie ziemlich klein sind. Wenn jedoch ein Bild von beträchtlicher Größe auf dem Pasteboard platziert wird, kann die resultierende Ausgabe um ein Vielfaches größer sein als die Quelle Daten (wobei mehrere Arten von TIFF- und PICT-Daten durch Filterung verfügbar gemacht werden).

Ich möchte, wenn möglich, einfach das sparen, was die Original-App zur Verfügung gestellt hat.


John, Sie sind weitaus aufmerksamer als ich oder der Herr, mit dem ich zusammenarbeite und der Mac-Programmierung betreibt, seit die Dinosaurier die Erde bevölkerten.Keiner von uns hat jemals den Text bemerkt, den Sie hervorgehoben haben ...und ich habe keine Ahnung warum.Anscheinend habe ich zu lange mit dem Problem begonnen.

Und obwohl ich Ihre Antwort als die richtige Antwort akzeptiert habe, beantwortet sie nicht genau meine ursprüngliche Frage.Was ich suchte, war eine Möglichkeit, Geschmacksrichtungen zu identifizieren, die durch einfaches Aufbringen auf die Pappe zu anderen Geschmacksrichtungen werden können UND um zu wissen, welche dieser Typen ursprünglich vom Anbieter angeboten wurden.Während ich durch die Liste der Typen gehe, erhalte ich die bevorzugte Reihenfolge für die Anwendung, die sie bereitgestellt hat. Es sagt mir jedoch nicht, welche ich getrost ignorieren kann, da sie neu erstellt werden, wenn ich die Pappe später wieder 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.

War es hilfreich?

Lösung

-[NSPasteboard types] kehren alle verfügbaren Typen für die Daten in der Zwischenablage, aber es sollte ihnen zurückkehren "in der Reihenfolge, wie sie deklariert wurden."

Die Dokumentation für -[NSPasteboard declareTypes:owner:] sagt, dass "die Typen sollten je nach Präferenz der Quellanwendung bestellt werden"

Ein richtig 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]]

Andere Tipps

Unter Umständen können Sie einige Verwendung raus +[NSPasteboard typesFilterableTo:] . Ich bin ein Snippet folgendermaßen abbildet:

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top