Привязка valuePath к NSImageView заставляет NSImageView.image возвращать nil при перетаскивании новых изображений в imagewell.

У меня есть NSImageView, который хорошо работает как изображение. Он также связан через. преобразователь значения, использующий свойство пути значения для отображения сохраненных изображений для каждой записи (преобразователь значения просто добавляет путь к файлу — я просто сохраняю имя файла изображения в базе данных).

Когда я хорошо перетаскиваю изображение на изображение, когда путь значения не привязан (т.е. пользователь еще не установил изображение), все работает хорошо - масштабирование и настройка изображения в базе данных, а затем отображение изображения. Если в базе данных уже есть изображение, отображаемое через. привязки, перетаскивающие новое изображение в ячейку изображения, приводят к тому, что NSImageView.image возвращает nil. Само представление изображения не равно нулю.

Я хорошо фиксирую перетаскиваемые изображения на изображении, хорошо устанавливая цель и действие на изображении.

    imageWell.target         = self
    imageWell.action         = "imageWellAction:"

Как я могу получить доступ к перетаскиваемому (новому) изображению, если другое изображение уже привязано к NSImageView?


person glenstorey    schedule 14.02.2016    source источник
comment
Не знаю. Но убедитесь, что у вас нет собственного подкласса со свойством изображения. Простой способ сделать вещи странными с KVC — непреднамеренно переопределить свойства управления какао.   -  person stevesliva    schedule 15.02.2016
comment
Переопределить performDragOperation:?   -  person Willeke    schedule 15.02.2016


Ответы (1)


Я провел очень много времени глубоко в недрах NSPasteboard и подкласса NSImageView (пытаясь проработать performDragOperation).

Проблема была вызвана тем, что NSValueTransformer не знал, что делать с URL-адресами, которые NSPasteboard передавали ему, когда он был привязан и на него были переброшены изображения.

В конце концов, самым простым способом исправить ситуацию было добавить NSImageView поверх связок какао, связанных NSImageView. Самый верхний вид изображения принимал операции перетаскивания, обновлял управляемый объект, а затем очищал его свойство .image. Нижний вид изображения замечает, что управляемый объект, к которому он привязан, обновляется, а затем корректно обновляет изображение.

So:

  • верхний вид изображения принимает перетаскивание, а затем очищается
  • нижнее (скрытое) представление изображения представляет собой представление изображения какао-бинтов, предназначенное только для отображения, а не для перетаскивания.

В идеале я был бы NSValueTransformer ниндзя и знал, что делать, чтобы обратно преобразовать удаленный URL-адрес монтажного стола (который всегда был нулевым, когда присутствовала привязка), но в этом случае я выбрал прагматизм.

person glenstorey    schedule 17.02.2016