Без фильтрации NSPasteboard
-
09-06-2019 - |
Вопрос
Есть ли способ отменить фильтрацию NSPasteboard для того, что исходное приложение конкретно заявило, что оно предоставит?
Я пытаюсь сериализовать данные монтажного стола в своем приложении.Когда другое приложение помещает файл RTF на монтажный стол, а затем я запрашиваю доступные типы, я получаю одиннадцать различных вариантов указанного RTF: от исходного RTF до простых строк и значений dyn.*.
Сохранение всех этих данных в plist или необработанные данные на диске обычно не является проблемой, поскольку они довольно малы, но когда на монтажный стол помещается изображение любого значительного размера, результирующий результат может быть в десятки раз больше, чем исходный. данные (при этом различные варианты данных TIFF и PICT становятся доступными посредством фильтрации).
Я бы хотел просто иметь возможность сохранить то, что было доступно в оригинальном приложении, если это возможно.
Джон, ты гораздо более наблюдателен, чем я или джентльмен, с которым я работаю, который занимается программированием для Mac с тех пор, как по земле бродили динозавры.Никто из нас так и не заметил выделенный вами текст...и я понятия не имею, почему.Судя по всему, слишком долго заморачивался над проблемой.
И хотя я принял ваш ответ как правильный, он не совсем отвечает на мой первоначальный вопрос.Я искал способ идентифицировать ароматы, которые могут стать другими ароматами, просто поместив их на картон. И чтобы узнать, какие из этих типов изначально предлагались провайдером.Просматривая список типов, я получаю предпочтительный порядок для приложения, которое их предоставило, но не сообщает мне, какие из них я могу безопасно игнорировать, поскольку они будут воссозданы, когда я позже заполню монтажный стол.
Я пришел к выводу, что не существует «хорошего» способа сделать это. [NSPasteboard declaredTypesFromOwner]
было бы здорово, но его не существует.
Решение
-[NSPasteboard types]
вернет все доступные типы данных в буфере обмена, но он должен вернуть их «в том порядке, в котором они были объявлены».
Документация для -[NSPasteboard declareTypes:owner:]
Говорит, что «типы должны быть упорядочены в соответствии с предпочтениями исходного приложения».
Поэтому правильно реализованный владелец монтажного стола должен объявить самое богатое представление содержимого (вероятно, исходное содержимое) как первый тип;поэтому разумное единственное представление должно быть:
[pb dataForType:[[pb types] objectAtIndex:0]]
Другие советы
Возможно, вам удастся получить некоторую пользу от +[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];
}
Однако я не уверен, насколько это будет эффективно при выборе хороших типов.