2010-01-20 9 views
0

Salut tout le monde, je suis un débutant et j'ai ce que j'anticipe sera une question assez facile à répondre. Afin d'en apprendre un peu plus sur la gestion des événements et le dessin, j'essaye d'écrire un programme qui dessine un rectangle noir dont la longueur augmente chaque fois que l'utilisateur touche la touche 'c'. Jusqu'à présent, il dessine simplement un rectangle noir sur un fond bleu sans répondre aux frappes. Voici ce que j'ai jusqu'à présent:Cocoa: Accepter et répondre aux frappes

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 

Je copié la méthode keyDown de cacao dans un Nutshell, par la voie. Inutile de dire que je ne le comprends pas vraiment. Dois-je établir des connexions dans IB pour que le programme reconnaisse les frappes au clavier? Fondamentalement, j'adorerais que quelqu'un puisse m'aider à faire fonctionner ce programme, car pour l'instant, je n'ai rien reçu pour répondre aux frappes.

Et voici Cocoa in a Nutshell

Répondre

1

IIRC, pour recevoir les frappes votre point de vue a besoin pour devenir le premier intervenant. Il devrait fonctionner si vous ajoutez quelque chose comme ces méthodes:

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

(. Vous pouvez faire d'autres choses en eux aussi, bien sûr, le cas échéant)

Mise à jour: Vous devez également marquer votre point de vue comme ayant besoin d'être redessiné. Ajouter:

[self setNeedsDisplay:YES]; 

Pour votre gestionnaire d'événements. Et c'est probablement une bonne idée d'ajouter un message de journal au début, afin que vous puissiez voir si la méthode est appelée:

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

Wow, merci pour la réponse rapide; Je ne m'attendais vraiment pas à ce que quelqu'un revienne aussi vite. J'ai ajouté ces méthodes à Input.m, mais je crains que cela ne fonctionne toujours pas: (Je pense que cela devrait être quelque chose de si basique, mais il semble que j'ai frappé un mur. Et encore, merci beaucoup –

+0

Voir la mise à jour ci-dessus Si cela échoue, et le message n'est pas enregistré, alors nous devrons creuser un peu plus loin – walkytalky

+0

Très bien! Vous êtes l'homme. C'était vraiment frustrant, la méthode setNeedsDisplay a fait l'affaire, je ne sais pas pourquoi, mais j'avais l'impression que la vue était activement redessinée, encore une fois, merci d'avoir pris le temps d'aider un débutant. –