Передать указатель объекта в операции перетаскивания - PullRequest
4 голосов
/ 23 сентября 2010

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

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

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

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

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

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

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

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

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

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

Я проверил документы Apple, но все еще не могу найти ответ.

Перетаскивание тем программирования

Руководство по программированию картона

Любая и вся помощь очень ценится.

1 Ответ

3 голосов
/ 23 сентября 2010

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

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

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

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

...