3

OSX 用の基本的な電卓アプリを作成して、Objective-C を学習しています。インターフェイスのボタンをクリックした場合と同じことを行うために、キーボードの特定のキーを押すことを許可する必要があることを除いて、すべてが美しく機能します。

私が読んだすべてのことは、これらをキャプチャするには、NSResponder のサブクラスにロジックが必要であると言っています。私の問題は、そのファイルを「接続」する方法にあります。次のように NSResponder をサブクラス化する新しい .h および .m ファイルを作成します。

Responder.h


#import <Foundation/Foundation.h>

@interface Responder : NSResponder

   - (void)keyDown:(NSEvent *)event;

@end

Responder.m


#import "Responder.h"

@implementation Responder

- (void)keyDown:(NSEvent *)event {
    NSAlert *alert = [[NSAlert alloc] init];
    [alert addButtonWithTitle:@"OK"];
    [alert setMessageText:@"Hey"];
    [alert setInformativeText:@"You Pressed A Key!"];
    [alert setAlertStyle:NSWarningAlertStyle];
    [alert runModal];
}

@end

アプリケーションはどのようにしてそのファイルの使用を認識しますか? その青い矢印をドラッグしてどこかに「接続」する.xibファイルのインターフェイスのどこかにありますか? 私はそれを正しくやっていますか?私はこれをしばらくグーグルで調べてきましたが、ほとんどすべてが、NSResponder サブクラスをアプリケーションに取得する方法を知っていると想定しています。ここでは、基本的な概念が本当に欠けていると思います。どんな助けでも大歓迎です!

4

1 に答える 1

8

「NSResponder のサブクラスで」と言うとき、必ずしも新しいNSResponder サブクラスを作成する必要があるという意味ではありません。つまり、キーの押下はレスポンダーによって処理されます。アプリの構造はレスポンダーでぎっしり詰まっています! したがって、キー処理プロセスに介入するには、それらのいずれかをサブクラス化します (コードを配置する場所を確保するため)。

あなたが見逃している「基本的な概念」はレスポンダーチェーンです:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html

(「レスポンダー チェーン」という見出しまでスクロールします。)

この種のコードを配置する場所としてよくあるのは、ウィンドウ コントローラーです。NSWindowController は NSResponder サブクラスです。これはレスポンダー チェーンの上位にあり、おそらく既にそのクラスを取得しています。

別のオプションは、ビューを使用することです。NSView は NSResponder サブクラスであり、ウィンドウはビューでいっぱいです。他の方法では不活性な NSView をウィンドウ内のすべての背後に配置しても、チェーンを上って来るイベントをキャッチするためのバックストップ NSResponder として機能するだけで驚くことではありません。

于 2013-04-07T14:45:49.223 に答える