2011-12-31 1 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 구성으로 응용 프로그램으로 묶어야합니다.

그렇지 않으면 창이 표시되지만 "응용 프로그램"이 포함 된 응용 프로그램이 활성화되지 않으므로 키보드 이벤트가 수신되지 않습니다. 창을 활성화하려고하면 이전 응용 프로그램이 활성 상태로 유지됩니다.

XCode의 MacRuby 템플릿을 사용하여 MacRuby 응용 프로그램 번들을 만듭니다. Xcode 4에는 몇 가지 추가 구성이 필요합니다. Follow these instructions.

일단 완료되면 MainMenu.xib 및 AppDelegate.rb 파일을 삭제하고 코드를 rb_main.rb에 붙여 넣으면 예상대로 작동합니다.

+0

올바른 사용 키 이벤트를 받아, 불행하게도, 그것은 나에게 거의 의미가 창 또는 함수 또는 모달 대화 상자가 표시되어 예상대로 작동하지 않기 때문에 제대로 수행 할 수 없습니다. 핵심 문제는 실행 중일 때 윈도우가 NSWindow.mainWindow 또는 NSWindow.keyWindow가 될 수 없다는 것입니다. 본질적으로 그것이 일류 시민이되지는 않습니다. – aryeh

+1

코코아 응용 프로그램에는 응용 프로그램 번들과 info.plist가 필요합니다. 주변에는 방법이 없습니다. 원하는 경우에도 프로그래밍 방식으로 창을 만들 수 있지만 올바른 응용 프로그램 내에서 창을 완료해야합니다. – Darren

+1

@aryeh : 요구 사항은 Xcode를 사용하는 것이 아닙니다. 요구 사항은 번들 응용 프로그램이라는 것입니다. 이것은 단지 지정된 폴더 구조이므로 스크립트를 작성하려는 경우 Makefile 내에서 그렇게 할 수 있습니다. –

0

번들에서 실행되지 않는 응용 프로그램 (그래서 PLIST이없는)을 설정할 수 있습니다 난 단지처럼 하나의 말을 응용 프로그램의 한 측면에 작업 할 때 자체가, 내가 엑스 코드 내에서 잘 작동한다고 알고 있어요

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