Нефильтрующая NSPasteboard - PullRequest
       10

Нефильтрующая NSPasteboard

5 голосов
/ 10 сентября 2008

Есть ли способ отфильтровать NSPasteboard для того, что приложение-источник специально заявило, что оно предоставит?

Я пытаюсь сериализовать данные из картона в моем приложении. Когда другое приложение помещает RTF-файл на монтажную панель, а затем я спрашиваю о доступных типах, я получаю одиннадцать различных разновидностей RTF - от исходного RTF до простых строк и до значений dyn. *.

Сохранение всех этих данных в plist или необработанные данные на диске обычно не является проблемой, так как оно довольно маленькое, но когда изображение любого значительного размера помещается на монтажную панель, результирующий вывод может быть в десятки раз больше чем исходные данные (с помощью фильтрации доступны различные разновидности данных TIFF и PICT).

Я хотел бы просто иметь возможность сэкономить на том, что исходное приложение сделало доступным, если это возможно.


Джон, ты гораздо более наблюдателен, чем я или джентльмен, с которым я работаю, который занимался программированием на Mac с тех пор, как динозавры бродили по земле. Никто из нас никогда не замечал текст, который вы выделили ... и я понятия не имею, почему. Слишком долгое рассмотрение проблемы, по-видимому.

И хотя я принял ваш ответ как правильный ответ, он не совсем отвечает на мой первоначальный вопрос. То, что я искал, было способом идентифицировать ароматы, которые могут стать другими ароматами, просто поместив их на картон И , чтобы узнать, какой из этих типов был первоначально предложен поставщиком. Хотя при просмотре списка типов я получу предпочтительный порядок для приложения, которое их предоставило, он не скажет мне, какие из них я могу безопасно проигнорировать, поскольку они будут воссозданы при повторном заполнении картона позже.

Я пришел к выводу, что не существует «хорошего» способа сделать это. [NSPasteboard declaredTypesFromOwner] было бы невероятно, но его не существует.

Ответы [ 2 ]

4 голосов
/ 12 сентября 2008

-[NSPasteboard types] вернет все доступные типы данных в буфере обмена, но он должен вернуть их "в порядке, в котором они были объявлены."

В документации для -[NSPasteboard declareTypes:owner:] сказано, что "типы должны быть упорядочены в соответствии с предпочтениями исходного приложения."

Правильно реализованный владелец монтажной панели должен поэтому объявить наиболее богатое представление содержимого (возможно, исходного содержимого) в качестве первого типа; поэтому разумное единственное представление должно быть:

[pb dataForType:[[pb types] objectAtIndex:0]]
0 голосов
/ 12 сентября 2008

Вы можете получить некоторое использование от +[NSPasteboard typesFilterableTo:]. Я представляю фрагмент так:

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

Однако я не уверен, насколько эффективно это будет делать при выборе хороших типов.

...