当我子窗口小部件并定义一个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
答案 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];