Элементы NSOutlineView остаются безнадежно неразрушимыми - PullRequest
1 голос
/ 24 марта 2011

У меня есть программа с NSOutlineView (которая поддерживает только одиночный выбор), из которой я хотел бы иметь возможность перетаскивать элементы.Эти элементы должны быть получены в виде текста или файлов: например, удаление элемента в окне TextEdit должно поместить текст, а удаление элемента в Finder должно создать файл.Я не хочу, чтобы что-либо было пропущено через мой контурный вид, даже если оно исходит от самого себя.Это кажется достаточно простым, но по какой-то причине я не могу заставить его работать.

Я проверил пример перетаскивания NSOutlineView от Apple, и я пришел к реализации следующих методов (плюс некоторые, безусловно, не связанныеиз них):

-(BOOL)outlineView:shouldSelectItem: // I don't expect to drag unselectable items
-(NSArray*)outlineView:namesOfPromisedFilesDroppedAtDestination:forDraggedItems:
-(BOOL)outlineView:writeItems:toPasteboard:

Тем не менее, когда я пытаюсь перетащить элемент из моего вида структуры, ничего не происходит.Вместо этого он просто меняет выделение после курсора.

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

Iздесь должно быть что-то действительно очевидное.

Кроме того, это (пока) не проблема, но как мне предоставить содержимое моих обещанных файлов?

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

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

1 голос
/ 25 марта 2011

Используете ли вы пользовательскую ячейку представления таблицы?Результат NSCell hitTestForEvent:inRect:ofView: определяет, можно ли инициировать операцию перетаскивания.Он также определяет, следует ли вызывать ваш outlineView:writeItems:toPasteboard:.

Этот метод должен возвращать NSCellHitContentArea для инициации перетаскивания или NSCellHitTrackableArea для расширения или изменения выделения.

Стандартный текстячейка возвращает NSCellHitContentArea, когда вы нажимаете на фактический текст ячейки, и NSCellHitTrackableArea, когда вы щелкаете за пределами текста.Это приводит к поведению перетаскивания, которое вы видите в табличном представлении Finder.

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

См. Тестирование удара для получения дополнительной информации.

...