Chciałem odpowiedzieć odpowiedzi tutaj, ale przycisk odpowiedzi wydaje się być nieobecny, więc jestem zmuszony udowodnić odpowiedź, kiedy naprawdę chcę zadać pytanie o odpowiedzi.
W każdym razie, widziałem kilka odpowiedzi na przesłonięcie zdarzenia -keyDown widoku tabeli, które mówi do podklasy TableView, ale zgodnie z każdą książką Objective-C, którą przeczytałem do tej pory, oraz kilka filmów szkoleniowych firmy Apple, powinieneś bardzo rzadko, jeśli kiedykolwiek, podklasuj jedną z podstawowych klas. W rzeczywistości każdy z nich wskazuje na to, że programiści C mają fascynację podklasowaniem i nie jest tak, jak działa Objective-C; w Objective-C chodzi o pomocników, a delegaci nie podklasy.
Więc, czy powinienem po prostu zignorować każdą odpowiedź, która mówi do podklasy, ponieważ wydaje się to być w bezpośredniej sprzeczności z przykazaniami Celu C?
--- Edit ---
znalazłem coś, co działało bez instacji NSTableView. Podczas gdy przenoszę dziedziczenie o jeden poziom w łańcuchu z NSObject na NSResponder, nie jestem całkowicie podklasy NSTableView. Dodaję możliwość nadpisania zdarzenia keyDown.
Ustawiłem klasę, której używałem jako delegata, dziedziczę z obiektu NSResponder zamiast NSObject i ustaw następnąResponder na tę klasę w awakeFromNib. Byłem wtedy w stanie pułapkować naciśnięcia klawiszy za pomocą zdarzenia keydown. Oczywiście podłączyłem IBOutlet i ustawiłem delegata w Interface Builder.
Oto mój kod z minimum niezbędnego, aby pokazać odłowu klucza:
plik nagłówka
// AppController.h
#import <Cocoa/Cocoa.h>
@interface AppController : NSResponder {
IBOutlet NSTableView *toDoListView;
NSMutableArray *toDoArray;
}
-(int)numberOfRowsInTableView:(NSTableView *)aTableView;
-(id)tableView:(NSTableView *)tableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(int)rowIndex;
@end
Oto plik m.
// AppController.m
#import "AppController.h"
@implementation AppController
-(id)init
{
[super init];
toDoArray = [[NSMutableArray alloc] init];
return self;
}
-(void)dealloc
{
[toDoArray release];
toDoArray = nil;
[super dealloc];
}
-(void)awakeFromNib
{
[toDoListView setNextResponder:self];
}
-(int)numberOfRowsInTableView:(NSTableView *)aTableView
{
return [toDoArray count];
}
-(id)tableView:(NSTableView *)tableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(int)rowIndex
{
NSString *value = [toDoArray objectAtIndex:rowIndex];
return value;
}
- (void)keyDown:(NSEvent *)theEvent
{
//NSLog(@"key pressed: %@", theEvent);
if (theEvent.keyCode == 51 || theEvent.keyCode == 117)
{
[toDoArray removeObjectAtIndex:[toDoListView selectedRow]];
[toDoListView reloadData];
}
}
@end
Świetna praca na MBTableGrid (i hojnej licencji), ale to znacznie więcej kodu niż to, co zrobiłem, aby zrobić to, czego potrzebuję. +1 za wysiłek wkładany w MBTableGrid. – dreamlax