Какао: принимать и реагировать на нажатия клавиш - PullRequest
0 голосов
/ 21 января 2010

Привет всем, я новичок, и у меня есть то, что я ожидаю, будет довольно легко ответить на вопрос. Чтобы немного узнать об обработке событий и рисовании, я пытаюсь написать программу, которая рисует черный прямоугольник, длина которого увеличивается каждый раз, когда пользователь нажимает клавишу «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

Кстати, я скопировал метод keyDown из Какао в двух словах. Само собой разумеется, я действительно не понимаю это. Нужно ли устанавливать соединения в IB, чтобы программа распознала нажатия клавиш? Вообще-то, мне бы очень хотелось, чтобы кто-нибудь помог мне заставить эту программу работать, потому что до сих пор я не получил ничего, чтобы реагировать на нажатия клавиш.

А вот и Какао в двух словах

1 Ответ

1 голос
/ 21 января 2010

IIRC, чтобы получать нажатия клавиш, ваше мнение должно стать первым респондентом. Это должно работать, если вы добавите что-то вроде этих методов:

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

(Конечно, вы можете делать и другие вещи в них, если это уместно.)

Обновление: Вы также должны пометить свой вид как подлежащий перерисовке. Добавить:

[self setNeedsDisplay:YES];

К вашему обработчику событий. И, вероятно, хорошей идеей будет также добавить сообщение журнала в начале, чтобы вы могли видеть, вызывается ли метод:

NSLog(@"keyDown [%@]", [theEvent characters]);
...