如果我不使用XCode和IB,为什么不调用keyDown?

时间:2011-12-31 18:46:04

标签: cocoa macruby

当我子窗口小部件并定义一个keyDown方法,然后在InterfaceBuilder中将窗口小部件的类指定为我使用keyDown方法定义的类时,它似乎工作正常。

但是,如果我以编程方式完成它,如下面的简单脚本所示,则永远不会调用keyDown方法。这是为什么?

是否有什么东西被XCode设置导致应用程序监听在幕后完成的事件?它是什么,我怎么在这里做?请指出我正确的方向。

我将再次阅读苹果文档并尝试弄清楚是否有一个事件处理程序注册,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 个答案:

答案 0 :(得分:1)

您的脚本需要捆绑为具有Info.plist配置的应用程序。

否则,您的窗口将可见,但其包含的“应用程序”将永远不会被激活,因此永远不会收到键盘事件。您应该注意到,当您尝试激活窗口时,之前的应用程序仍然处于活动状态。

使用XCode中的MacRuby模板创建MacRuby应用程序包。 XCode 4需要一些额外的配置:Follow these instructions

完成后,您可以删除MainMenu.xib和AppDelegate.rb文件,将代码粘贴到rb_main.rb中,它将按预期工作。

答案 1 :(得分:1)

您可以在没有应用程序包和plist的情况下执行此操作,但您需要像这样启动应用程序:

app = MyApp.sharedApplication
app.activationPolicy = NSApplicationActivationPolicyRegular
app.activateIgnoringOtherApps(true)
app.run

答案 2 :(得分:0)

未从捆绑包启动的应用程序(因此没有plist)可以将自己设置为使用

接受关键事件
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
[NSApp activateIgnoringOtherApps:YES];
[NSApp run];