2010-09-23 3 views
4

Можно ли передать указатель на объект в режиме перетаскивания?Пропустить указатель объекта в операции перетаскивания

Вот сценарий ...

У меня есть 'NSArray' пользовательских объектов. Для аргументов мы скажем, что это список объектов человека.

Этот список привязан к NSTableView через NSArrayController. NSTableView - источник перетаскивания, и у меня есть NSView в качестве места для перетаскивания.

При реализации перетаскивания можно легко получить имя выбранного человека (ов) из NSArrayController как NSString в процессе перетаскивания и передать его получателю в NSView.

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

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

В идеале я хочу указатель на объект, потому что NSView будет использовать ссылку на объект, чтобы любые обновления самого объекта отражались как в NSView, так и в NSTableView (и везде, где используется объект).

Возможно ли использовать ссылку на объект в операции перетаскивания или мне нужно передать какую-то пользовательскую ссылку, которая является iVar объекта person, а затем выполнить поиск после того, как он достигнет пункта назначения? (Мне кажется, что мне кажется немного архаичным, учитывая, сколько объектов ссылка на Obj-c).

Я понимаю, что цель может принять операцию перетаскивания извне приложения, но указание операции как локальной операции будет учитывать это, не так ли?

Я проверил документы яблока, но, похоже, пока не нашел ответа.

Drag and Drop Programming Topics

Pasteboard Programming Guide

Любые и все очень оцененная.

ответ

3

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

Вам нужно предоставить каждому объекту Person идентификатор какого-либо типа и поместить его на картотеку под индивидуальным идентификатором вашего собственного изобретения. Как правило, такой идентификатор должен быть идентификатором связки вашего приложения (который должен быть обратным имени вашего домена и вашим именем приложения, например, com.example.surfwriter) плюс имя типа (например, com.example.surfwriter .tabstop).

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

Не используйте адрес объекта-i.e., Сам объект - как его идентификатор. Если объект умирает (например, удаляется), адрес больше не будет действительным или может ссылаться на другой объект (который может быть или не быть того же класса, что и исходный объект). Используйте то, что вы можете найти и безопасно не найти. Это относится к вырезанию/копированию и вставке больше, чем к перетаскиванию, но вы можете и должны обрабатывать оба с почти одинаковым кодом.

+0

Спасибо, Питер! Похоже, я смотрел на правильный путь - просто не прошел достаточно далеко. Полезно знать, что не использовал адрес самого объекта - я просто изучал, был ли это жизнеспособным вариантом или нет. Сроки - это все! :-) – Hooligancat

+0

Питер, просто чтобы вы знали, что отлично работали. :-) Благодаря!! Я закончил создание префикса идентификатора в глобальном классе методов, который у меня есть. Каждая модель имеет метод «cardboardRef», который возвращает его собственное имя класса и уникальный идентификатор объекта. Затем это отправляется через картотеку и берется на место назначения и разбирается, чтобы вернуть класс и идентификатор. Работает очарование! – Hooligancat

 Смежные вопросы

  • Нет связанных вопросов^_^