嘿大家,我是新手,我有一个我预期的问题很容易回答。为了学习一些关于事件处理和绘图的知识,我试图编写一个程序来绘制一个黑色矩形,每当用户点击“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
顺便说一句,我在Cuts中复制了Cocoa中的keyDown方法。不用说,我真的不明白。我是否必须在IB中建立连接以使程序识别击键?基本上,如果有人可以帮助我让这个程序工作,我会很高兴,因为到目前为止我还没有得到任何回应键击。
答案 0 :(得分:1)
- (BOOL) acceptsFirstResponder
{
return YES;
}
- (BOOL) resignFirstResponder
{
return YES;
}
- (BOOL) becomeFirstResponder
{
return YES;
}
(当然,如果合适的话,你也可以在其中做其他的事情。)
更新:您还需要将视图标记为需要重新绘制。添加:
[self setNeedsDisplay:YES];
到您的事件处理程序。并且在开头添加日志消息也是一个好主意,这样您就可以看到该方法是否被调用:
NSLog(@"keyDown [%@]", [theEvent characters]);