0

みなさん、こんにちは。私は初心者です。答えるのはとても簡単な質問になると思います。イベントの処理と描画について少し学ぶために、ユーザーが「c」キーを押すたびに長さが長くなる黒い長方形を描画するプログラムを作成しようとしています。これまでのところ、キーストロークに応答せずに、青い背景に黒い長方形を描画するだけです。これが私がこれまでに持っているものです:

Input.h

#import <Cocoa/Cocoa.h>


@interface Input : NSView {

 int length;

}

- (void)keyDown:(NSEvent *)theEvent;
@end

Input.m

#import "Input.h"


@implementation Input

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];

 length = 10;

    if (self) {
        // Initialization code here.
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
 //set variables
 NSRect r1;
 NSBezierPath *bp;

    // set background color
 [[NSColor blueColor] set];
 NSRectFill(dirtyRect);

 //set color to black & draw r1
 [[NSColor blackColor] set];
 r1 = NSMakeRect(1, 1, length, 10);
 bp = [NSBezierPath bezierPathWithRect:r1];
 [bp fill];


}

- (void)keyDown:(NSEvent *)theEvent
{
    NSString *key = [theEvent characters];

    if ( [key isEqualToString:@"c"] ) {
        length += 10;
    }
}

@end

ちなみに、CocoaからkeyDownメソッドを簡単にコピーしました。言うまでもなく、私はそれを本当に理解していません。プログラムにキーストロークを認識させるには、IBで接続する必要がありますか?基本的に、誰かがこのプログラムを動作させるのを手伝ってくれるなら、私はそれが大好きです。なぜなら、まだ私はキーストロークに応答するものを何も得ていないからです。

そして、これが一言で言えばココアです

4

1 に答える 1

1

IIRC、キーストロークを受け取るには、ビューがファーストレスポンダーになる必要があります。次のようなメソッドを追加すると、機能するはずです。

- (BOOL) acceptsFirstResponder
{
    return YES;
}
- (BOOL) resignFirstResponder
{
    return YES;
}
- (BOOL) becomeFirstResponder
{
    return YES;
}

(もちろん、必要に応じて、他のこともできます。)

更新:ビューを再描画する必要があるものとしてマークする必要もあります。追加:

[self setNeedsDisplay:YES];

イベントハンドラーへ。また、メソッドが呼び出されているかどうかを確認できるように、最初にログメッセージも追加することをお勧めします。

NSLog(@"keyDown [%@]", [theEvent characters]);
于 2010-01-20T22:31:05.800 に答える