Cocoa: прием и реакция на нажатия клавиш

Привет всем, я новичок, и у меня есть вопрос, на который, как я ожидаю, будет довольно легко ответить. Чтобы немного узнать об обработке событий и рисовании, я пытаюсь написать программу, которая рисует черный прямоугольник, длина которого увеличивается каждый раз, когда пользователь нажимает клавишу «c». Пока он просто рисует черный прямоугольник на синем фоне, не реагируя на нажатия клавиш. Вот что у меня есть до сих пор:

Вход.ч

#import <Cocoa/Cocoa.h>


@interface Input : NSView {

 int length;

}

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

Вход.м

#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 из Cocoa in a Nutshell. Излишне говорить, что я действительно не понимаю этого. Должен ли я устанавливать соединения в IB, чтобы программа распознавала нажатия клавиш? По сути, я был бы рад, если бы кто-нибудь помог мне заставить эту программу работать, потому что до сих пор я не получил ничего, что могло бы реагировать на нажатия клавиш.

А вот Кратко о какао


person Arthur Skirvin    schedule 20.01.2010    source источник


Ответы (1)


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

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

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

Обновление: вам также необходимо пометить представление как требующее перерисовки. Добавлять:

[self setNeedsDisplay:YES];

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

NSLog(@"keyDown [%@]", [theEvent characters]);
person walkytalky    schedule 20.01.2010
comment
Ничего себе, спасибо за своевременный ответ; Я действительно не ожидал, что кто-то вернется так быстро. Я добавил эти методы в Input.m, но боюсь, что он все еще не работает :(. Я чувствую, что это должно быть что-то настолько простое, но, похоже, я уперся в стену. Есть другие идеи или предложения? И еще раз большое спасибо. - person Arthur Skirvin; 21.01.2010
comment
Смотрите обновление выше. Если это не удается и сообщение не регистрируется, нам придется копнуть немного глубже. - person walkytalky; 21.01.2010
comment
Хорошо! Ты мужчина. Большое спасибо. Это чертовски раздражало. Метод setNeedsDisplay сделал свое дело. Не знаю почему, но у меня сложилось впечатление, что вид активно перерисовывался. Еще раз спасибо, что нашли время помочь новичку. - person Arthur Skirvin; 21.01.2010