Ответ 1
Существует два способа использования NSPasteboard.
Пожилой способ: вывести данные на плату самостоятельно
Во-первых, вы должны объявить типы, которые вы разместите на картотеке. Вы также назначаете объект, который будет "владеть" картоном, что означает, что это объект, помещающий материал в картон.
Следующим шагом является размещение данных на картоне. Этот шаг является необязательным.
"Необязательно?!", спросите вы. Да. Если вы не помещаете данные в картон для любого объявленного вами типа, и впоследствии картотеку нужны эти данные (для вставки/удаления), тогда cardboard спросит вас (владельца) об этом. Это называется перспективным, что данные, и это хорошо, когда эти данные дорого копировать (большие) или генерировать.
Есть пять способов разместить вещи на картоне (помимо того, что их попросят):
- Как строка. Только для простого текста. Картон будет обрабатывать преобразование его в различные кодировки по мере необходимости.
- Как список свойств. Только для списков свойств (и да, это принудительно применяется до конца, поэтому массив изображений не работает 't count), или вещи, которые вы можете преобразовать в списки свойств и из них. Это может включать ваши собственные объекты, если вы реализуете их в них.
- Как исходные данные. Хорошее для существующих типов данных, таких как типы изображений (PNG, JPEG и т.д.) и типы A/V ( MPEG-4 и т.д.).
- Как содержимое файла, идентифицированное по пути. Только хорошо, если то, что вы перетаскиваете/копируете, уже является файлом.
- Как содержимое файловой оболочки. Если вы еще не используете обертки файлов, вы можете спокойно проигнорировать это.
Новейший способ: привязать объекты к плате и позволить им превратиться в данные
Новая жара, введенная в Snow Leopard, заключается в том, чтобы ваши объекты сами могли писать себя на картоне. Это требует, чтобы они знали все о себе, что вам нужно на картоте, включая идентификаторы.
Вам нужно сделать ваши объекты соответствующими NSPasteboardWriting и NSPasteboardReading.
Протокол записи будет выглядеть действительно знакомым теперь, когда вы знаете более старый способ. Картон запрашивает ваш объект какие типы он будет представлять как, тогда спрашивает его для объекта списка свойств для каждого типа. (Протокол также предоставляет способ обещать типы вместо того, чтобы немедленно запрашивать данные для них.)
Чтобы скопировать объекты, соответствующие NSPasteboardWriting, на картотеку, отправьте сообщение a clearContents
(требуется по-новому, необязательно по-старому), затем writeObjects:
передайте массив объектов, которые вы хотите скопировать.
Протокол чтения, как и следовало ожидать, является обратным. Чтобы вставить, вы отправляете сообщение a readObjectsForClasses:options:
. Картограф задает каждому из этих классов какие типы он распознает, затем (необязательно) пытается создать экземпляр одного или нескольких из них из того, что на картоне.
Недостатком этого, особенно в том, что касается идентификаторов повторного использования, является то, что он может в конечном итоге нарушить разделение вашего слоя модели с уровня вашего контроллера. Ваш инициализатор чтения должен знать, что делать с идентификатором, если вы хотите, чтобы он возвращал существующий объект с этим идентификатором. Это означает, что ему нужно либо поговорить с контроллером (плохо), либо дублировать код поиска контроллера (хуже).
Я не знаю о хорошем способе реализации перетаскивания (включая, но не ограничиваясь этим, переупорядочение) с новыми протоколами, не сталкиваясь с этой проблемой. Для копирования и перетаскивания (включая, но не ограничиваясь этим, кросс-процесс) это прекрасно, поскольку вам не нужны идентификаторы для этого: просто создайте данные на одном конце и создайте новую копию с нее на другом.
Поверхность нового способа заключается в том, что обработка нескольких элементов намного более разумна. По старому способу существует только один "элемент" - на самом деле, на самом деле нет понятия предметов вообще - в нескольких типах. Если вы хотите скопировать или перетащить несколько объектов, вы сделали массив и скопировали его как отдельный список свойств для некоторого типа, а затем повторно создали/извлекли несколько вещей из этого единственного списка свойств на другом конце. Новый способ явно поддерживает один или несколько элементов; при копировании нескольких вещей вы просто передаете их всем на writeObjects:
.
Ваш случай: единственный идентификатор NSUInteger
Вставьте его в NSNumber (список свойств) и используйте его более старым способом.