Я хотел ответить на ответы здесь, но кнопка ответа, кажется, отсутствует, поэтому я вынужден доказать ответ, когда я действительно просто хочу задать вопрос об ответах.
В любом случае, я видел несколько ответов для переопределения события -keyDown табличного представления, в которых говорится о создании подкласса TableView, но согласно каждой книге Objective-C, которую я прочитал до сих пор, и нескольким обучающим видео Apple, вы следует очень редко, если когда-либо подкласс одного из основных классов. Фактически, каждый из них подчеркивает, что программисты на C увлечены подклассами, а это не так, как работает Objective-C; что в Objective-C все о помощниках и делегатах, а не о создании подклассов.
Итак, я должен просто игнорировать какие-либо ответы, которые говорят подклассу, поскольку это, кажется, находится в прямом противоречии с заповедями Objective-C?
--- Редактировать ---
Я нашел что-то, что работало без подкласса NSTableView. Хотя я перемещаю наследование на одну ступень вверх по цепочке от NSObject к NSResponder, я не полностью подклассифицирую NSTableView. Я просто добавляю возможность переопределить событие keyDown.
Я сделал класс, который использовал в качестве делегата, наследуемым от NSResponder вместо NSObject и установил nextResponder для этого класса в awakeFromNib. Затем я смог отловить нажатие клавиш с помощью события keydown. Я, конечно, подключил IBOutlet и установил делегата в Интерфейсном Разработчике.
Вот мой код с минимумом, необходимым для отображения захвата ключа:
Заголовочный файл
// 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
Вот файл 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