До сегодняшнего дня у меня никогда не было возможности использовать что-либо, кроме самого NSWindow в качестве NSDraggingDestination. При использовании окна в качестве универсального пункта назначения для перетаскивания NSWindow передает эти сообщения своему делегату, позволяя обрабатывать отбрасывание без создания подкласса NSWindow.
Хотя NSDraggingDestination объявлен как неформальный протокол, подклассы NSWindow и NSView, которые вы создаете для принятия протокола, должны реализовывать только те методы, которые уместны. (Классы NSWindow и NSView предоставляют частные реализации для всех методов.) Эти методы могут быть реализованы либо оконным объектом, либо его делегатом; однако реализация делегата имеет приоритет, если есть реализации в обоих местах.
Сегодня у меня было окно с двумя NSTextFields на нем, и я хотел, чтобы у них было другое поведение при перетаскивании, и я не хотел допускать перетаскивания где-либо еще в окне. То, как я интерпретирую документы, кажется, что мне нужно либо создать подкласс NSTextField, либо создать несколько гигантских спагетти-условных обработчиков перетаскивания в делегате окна, которые проверяют перетаскивание для каждого представления, чтобы выбрать различные варианты поведения области перетаскивания для каждое поле.
Подход централизованного обработчика перетаскивания на основе делегатов NSWindow кажется обременительным в любом случае, когда у вас было больше, чем небольшая горстка представлений назначения перетаскивания. Точно так же подход к подклассам кажется обременительным независимо от случая, потому что теперь код обработки отбрасывания находится в классе представления, поэтому, как только вы принимаете отбрасывание, вам нужно придумать какой-то способ маршалинга отброшенных данных обратно в модель. docs предупредить вас о попытках управлять привязками, задав значение пользовательского интерфейса программно. Так что теперь вы тоже застряли, пытаясь обойти это.
Итак, мой вопрос: «Правда !? Это единственные доступные варианты? Или мне здесь не хватает чего-то простого?»
Спасибо.