quería responder a las respuestas aquí, pero parece que falta el botón de respuesta, así que estoy obligado a probar una respuesta cuando realmente solo quiero hacer una pregunta sobre las respuestas.
De todos modos, he visto algunas respuestas para anular el evento -keyDown de la vista de tabla que dicen subclase el TableView pero de acuerdo con cada libro de Objective-C que he leído hasta ahora, y varios videos de entrenamiento de Apple, muy rara vez, si alguna vez subclases, una de las clases principales. De hecho, cada uno de ellos señala que los programadores C tienen una fascinación por las subclases y que no es así como funciona Objective-C; que Objective-C se trata de ayudantes y delegados que no hacen subclases.
Entonces, ¿debería simplemente ignorar cualquiera de las respuestas que dicen a la subclase ya que esto parece estar en contradicción directa con los preceptos de Objective-C?
--- --- Editar
encontré algo que funcionaba sin la subclasificación de la NSTableView. Si bien muevo la herencia a una muesca de la cadena desde NSObject a NSResponder, no estoy subclasificando totalmente el NSTableView. Solo agrego la capacidad de anular el evento KeyDown.
Hice que la clase que estaba usando como delegado herede de NSResponder en lugar de NSObject y configuré el nextResponder en esa clase en awakeFromNib. Pude atrapar pulsaciones de teclas usando el evento Keydown. Por supuesto, conecté IBOutlet y configuré el delegado en Interface Builder.
Aquí está mi código con el mínimo necesario para mostrar la captura de la clave:
Archivo de cabecera
// 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
Aquí está el archivo 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
Gran trabajo en MBTableGrid (y una licencia generosos también), pero eso es mucho más código que lo que he hecho para hacer lo que necesito sin embargo. +1 por el esfuerzo que ha puesto en MBTableGrid. – dreamlax