Проблема с перетаскиванием событий в приложении MacRuby - PullRequest
4 голосов
/ 14 ноября 2011

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

У меня проблемы с получением настраиваемого представления для ответа на события перетаскивания.

class ImportPanel < Panel
  def initWithFrame(frame)
    registerForDraggedTypes(NSArray.arrayWithObjects(NSPasteboardTypeSound, nil))
    super(frame)
  end

  def mouseDown(event)
    NSLog('click')
  end

  def draggingEntered(sender)
    NSLog('drag')
  end
end

Панель, в данном случае, это просто NSView, который добавляет границу. Это пользовательское представление (ImportPanel) правильно реагирует на события щелчка, но никак не реагирует на события перетаскивания. Я перепробовал несколько различных типов и конфигураций монтажной панели для registerForDraggedTypes:, но ни один из них, похоже, не дал никаких результатов.

1 Ответ

0 голосов
/ 13 декабря 2011

Этот код работал для меня.

AppDelegate.rb

class AppDelegate
    attr_accessor :window
    attr_accessor :panel

    def applicationDidFinishLaunching(a_notification)
        # nothing special here
    end

    def initialize
        @panel = Panel.new

        # Just for debug
        puts @panel
    end
end

А это мой player.rb:

class Panel < NSView
    def awakeFromNib
        registerForDraggedTypes(NSArray.arrayWithObjects(NSFilenamesPboardType, NSURLPboardType, NSStringPboardType, nil))
    end

    def mouseDown(event)
        NSLog('click')
    end

    def draggingEntered(sender)
        NSLog('drag')
        return NSDragOperationNone
    end
end

Массив перетаскиваемых типов, который помогает мне тестировать различные операции перетаскивания (URL, файл и т. Д.). Обратите внимание, что draggingEntered должен возвращать NSDragOperation, который я использовал NSDragOperationNone, просто чтобы посмотреть, работает ли он.

...