2011-12-31 8 views
1

私はウィジェットをサブクラス化とはKeyDownメソッドを定義し、InterfaceBuilderで、私はKeyDownイベントメソッドで定義されたクラスであるウィジェットのクラスを割り当てると、正常に動作するようです。XCodeとIBを使用しないと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 

答えて

1

あなたはアプリケーションバンドルとのplistせずにそれを行うことができますが、あなたはそうのようなアプリを起動する必要があります。

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

これは機能します。ありがとうございました! – aryeh

1

スクリプトはInfo.plist構成でアプリケーションとしてバンドルする必要があります。

そうでない場合は、あなたのウィンドウが表示されますが、それを含む「アプリケーションが」活性化されることはありませんので、キーボードイベントを受け取ることはありません。ウィンドウをアクティブにしようとすると、前のアプリケーションはアクティブのままです。

はMacRubyのアプリケーションバンドルを作成するために、XcodeでMacRubyのテンプレートを使用してください。 XCode 4にはいくつかの追加設定が必要です:Follow these instructions

完了したら、MainMenu.xibファイルとAppDelegate.rbファイルを削除し、コードをrb_main.rbに貼り付けると、期待どおりに動作します。

+0

正しい使用してキーイベントを受け入れるように、残念ながら、それは、私にはほとんど意味がありませんウィンドウ、関数、またはモーダルダイアログが表示され、正常に動作しないため正しく実行できません。コアの問題は、実行中にウィンドウがNSWindow.mainWindowまたはNSWindow.keyWindowになることを許可していないことです。基本的には第一級の市民にはなりません。 – aryeh

+1

Cocoaアプリケーションにはアプリケーションバンドルとinfo.plistが必要です。その周りには道はない。必要に応じてプログラムでウィンドウを作成することはできますが、有効なアプリケーション内から行う必要があります。 – Darren

+1

@aryeh:Xcodeを使用する要件ではありません。要件はバンドルされたアプリケーションであるということです。これはあくまで指定されたフォルダ構造なので、スクリプトを記述したい場合は、Makefile内で行うことができます。 –

0

バンドルから起動されていないアプリケーションが(そう何のplistはありません)を設定することができます私だけのようなものを言うのアプリの一つの側面に仕事をしたいとき、それ自体が、私はXcodeの中にそれが正常に動作することを承知している

[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; 
[NSApp activateIgnoringOtherApps:YES]; 
[NSApp run]; 
関連する問題