NSPasteboard и простые пользовательские данные

У меня очень трудное время, чтобы заставить NSPasteboard работать, поэтому простите меня за мое понимание.

Все, что я хочу, это простой способ записи и извлечения из картонного значения NSUInteger, который предназначен только для моего приложения. Все, что я делаю, это перетаскивание элемента в моем приложении, поэтому все, что мне нужно в картотеке, это идентификатор элемента.

Я пробовал посмотреть в NSPasteboardItemDataProvider и NSPasteboardItem и NSData, но все они имеют сложный способ сделать что-то настолько простое. Infact, я понятия не имею, что является правильным способом сделать что-то настолько простое - каждый образец вокруг, похоже, имеет дело со строковым типом или чем-то гораздо более сложным. Селектор [NSMutable SetData], похоже, не существует, даже если в коде нет предупреждений.

Если кто-то может указать мне в правильном направлении, я был бы очень благодарен.:)

Изменить: я использую [dragImage...], чтобы помочь мне с помощью операций перетаскивания.

Ответы

Ответ 1

Существует два способа использования NSPasteboard.

Пожилой способ: вывести данные на плату самостоятельно

Во-первых, вы должны объявить типы, которые вы разместите на картотеке. Вы также назначаете объект, который будет "владеть" картоном, что означает, что это объект, помещающий материал в картон.

Следующим шагом является размещение данных на картоне. Этот шаг является необязательным.

"Необязательно?!", спросите вы. Да. Если вы не помещаете данные в картон для любого объявленного вами типа, и впоследствии картотеку нужны эти данные (для вставки/удаления), тогда cardboard спросит вас (владельца) об этом. Это называется перспективным, что данные, и это хорошо, когда эти данные дорого копировать (большие) или генерировать.

Есть пять способов разместить вещи на картоне (помимо того, что их попросят):

Новейший способ: привязать объекты к плате и позволить им превратиться в данные

Новая жара, введенная в Snow Leopard, заключается в том, чтобы ваши объекты сами могли писать себя на картоне. Это требует, чтобы они знали все о себе, что вам нужно на картоте, включая идентификаторы.

Вам нужно сделать ваши объекты соответствующими NSPasteboardWriting и NSPasteboardReading.

Протокол записи будет выглядеть действительно знакомым теперь, когда вы знаете более старый способ. Картон запрашивает ваш объект какие типы он будет представлять как, тогда спрашивает его для объекта списка свойств для каждого типа. (Протокол также предоставляет способ обещать типы вместо того, чтобы немедленно запрашивать данные для них.)

Чтобы скопировать объекты, соответствующие NSPasteboardWriting, на картотеку, отправьте сообщение a clearContents (требуется по-новому, необязательно по-старому), затем writeObjects: передайте массив объектов, которые вы хотите скопировать.

Протокол чтения, как и следовало ожидать, является обратным. Чтобы вставить, вы отправляете сообщение a readObjectsForClasses:options:. Картограф задает каждому из этих классов какие типы он распознает, затем (необязательно) пытается создать экземпляр одного или нескольких из них из того, что на картоне.

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

Я не знаю о хорошем способе реализации перетаскивания (включая, но не ограничиваясь этим, переупорядочение) с новыми протоколами, не сталкиваясь с этой проблемой. Для копирования и перетаскивания (включая, но не ограничиваясь этим, кросс-процесс) это прекрасно, поскольку вам не нужны идентификаторы для этого: просто создайте данные на одном конце и создайте новую копию с нее на другом.

Поверхность нового способа заключается в том, что обработка нескольких элементов намного более разумна. По старому способу существует только один "элемент" - на самом деле, на самом деле нет понятия предметов вообще - в нескольких типах. Если вы хотите скопировать или перетащить несколько объектов, вы сделали массив и скопировали его как отдельный список свойств для некоторого типа, а затем повторно создали/извлекли несколько вещей из этого единственного списка свойств на другом конце. Новый способ явно поддерживает один или несколько элементов; при копировании нескольких вещей вы просто передаете их всем на writeObjects:.

Ваш случай: единственный идентификатор NSUInteger

Вставьте его в NSNumber (список свойств) и используйте его более старым способом.