Вопрос

Есть ли способ отменить фильтрацию 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];
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top