Почему не вызывается keyDown, если я не использую XCode и IB? - PullRequest
1 голос
/ 31 декабря 2011

Когда я создаю подкласс виджета и определяю метод keyDown, а затем в InterfaceBuilder назначаю класс виджета тем классом, который я определил с помощью метода keyDown, он, кажется, работает нормально.

Однако, если я выполню это программно, как показано в простом скрипте ниже, метод keyDown никогда не будет вызван. Почему это?

Есть ли что-то настраиваемое XCode, которое заставляет приложение прослушивать события, которые выполняются за кулисами? Что это, и как мне сделать это здесь? Пожалуйста, укажите мне в правильном направлении.

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

Спасибо!

framework 'Cocoa'

class MyView < NSView
  def acceptsFirstResponder
    true
  end

  def keyDown(event)
    puts "key down MyView"
  end
end

class MyWindow < NSWindow
  def acceptsFirstResponder
    true
  end

  def keyDown(event)
    puts "key down in MyWin"
  end
end

class MyApp < NSApplication
  def acceptsFirstResponder
    true
  end

  def keyDown(event)
    puts "key down in MyApp"
  end
end

application = MyApp.sharedApplication

# create the window
frame  = [0.0, 0.0, 300, 200]
mask = NSTitledWindowMask | NSClosableWindowMask
window = MyWindow.alloc.initWithContentRect(frame,
          styleMask:mask,
          backing:NSBackingStoreBuffered,
          defer:false)

# assign a content view instance
content_view = MyView.alloc.initWithFrame(frame)
window.contentView = content_view

window.makeFirstResponder(window)

# show the window
window.display
window.makeKeyAndOrderFront(nil)

application.run

Ответы [ 3 ]

1 голос
/ 05 января 2012

Вы можете сделать это без пакета приложений и списка, но вам нужно запустить приложение так:

app = MyApp.sharedApplication
app.activationPolicy = NSApplicationActivationPolicyRegular
app.activateIgnoringOtherApps(true)
app.run
1 голос
/ 01 января 2012

Ваш скрипт должен быть упакован как приложение с конфигурацией Info.plist.

В противном случае ваше окно будет видимым, но содержащее его «приложение» никогда не будет активировано и, следовательно, никогда не получит события клавиатуры,Вы должны заметить, что при попытке активировать свое окно предыдущее приложение остается активным.

Используйте шаблон MacRuby в XCode для создания пакета приложения MacRuby.XCode 4 требует некоторой дополнительной настройки: Следуйте этим инструкциям .

Как только это будет сделано, вы можете удалить файлы MainMenu.xib и AppDelegate.rb, вставить свой код в rb_main.rb ибудет работать как положено.

0 голосов
/ 09 июня 2013

Приложение, которое не запускается из комплекта (поэтому отсутствует plist), может настроить себя на прием ключевых событий, используя

[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
[NSApp activateIgnoringOtherApps:YES];
[NSApp run];
...