2011-01-12 15 views

Respuesta

12

Implementé algo similar al LTKeyPressTableView. Sin embargo, utilizo controladores de matriz, así que en mi subclase agregué IBOutlet NSArrayController * relatedArrayController. En lugar de manejar la solicitud de eliminación en un delegado, lo manejo directamente en la subclase, ya que mi subclase trata específicamente con el manejo adicional de la tecla Eliminar. Cuando detecto la tecla presionar para borrar la tecla, solo llamo al [relatedArrayController delete:nil];.

IRTableView.h:

#import <Cocoa/Cocoa.h> 

@interface IRTableView : NSTableView { 
    IBOutlet NSArrayController * relatedArrayController; 
} 

@end 

y IRTableView.m:

#import "IRTableView.h" 


@implementation IRTableView 


- (void)keyDown:(NSEvent *)event 
{ 
    // Based on LTKeyPressTableView. 
    //https://github.com/jacobx/thoughtkit/blob/master/LTKeyPressTableView 

    id delegate = [self delegate]; 

    // (removed unused LTKeyPressTableView code) 

    unichar key = [[event charactersIgnoringModifiers] characterAtIndex:0]; 
    if(key == NSDeleteCharacter) 
    { 
     if([self selectedRow] == -1) 
     { 
      NSBeep(); 
     } 

     BOOL isEditing = ([[self.window firstResponder] isKindOfClass:[NSText class]] && 
          [[[self.window firstResponder] delegate] isKindOfClass:[IRTableView class]]); 
     if (!isEditing) 
     { 
      [relatedArrayController remove:nil]; 
      return; 
     } 

    } 

    // still here? 
    [super keyDown:event]; 
} 

@end 

resultado final es bastante IB-amigable para mí, y una solución muy simple para su uso en un cacao enlaces + Core Aplicación de datos

26

Lo que suelo hacer es crear un nuevo elemento de menú en la barra de menú de la aplicación. Algo así como:

File -> Delete ${Name of Item}

A continuación, puede vincular esa NSMenuItem en Interface Builder para que apunte a un método IBAction definido en alguna parte en cualquiera delegado de la aplicación o algún otro controlador. La implementación de este método debe eliminar el elemento de su modelo y actualizar el NSTableView.

La ventaja de hacer una NSMenuItem fuera de la acción es que:

  1. le puede dar la opción de una combinación de teclas en el Interface Builder. (Como la tecla de borrar).
  2. Los usuarios que no estén familiarizados con su aplicación, teman presionar la tecla Eliminar o no tengan acceso a un teclado por el motivo que sea, aún pueden hacer uso de esta funcionalidad.
+1

Hola, Craig. Tu respuesta no fue la que realmente esperaba, ¡pero suena bastante bien! = D Muchas gracias. – Leandro

+2

Jaja sí, al principio parece una aproximación bastante indirecta, pero funciona extremadamente bien, y se ocupa de muchos dolores de cabeza. –

+0

a menos que tenga dos vistas de tabla ... – peetonn

9

Después de 10.10, NSViewController es parte de la cadena de respuesta. Así que la forma más fácil es implementar keyDown en su NSViewController subclasificado

+1

Buen punto sobre el uso de la cadena de respuesta para evitar la creación de subclases (cuando sea posible). –

4

No es necesario crear una subclase y capturar keyDown en NSViewController.

El elemento de menú Delete en el menú Edit está conectado al selector delete: de First Responder. Si no hay un elemento de menú Delete, cree uno y conéctelo al delete: de First Responder (cubo rojo).

  • Asignar una clave equivalente para el elemento Delete menú ( o ⌘⌫)
  • En el controlador de vista implementar el método IBAction

    Swift: @IBAction func delete(_ sender: AnyObject)

    Objetivo- C: -(IBAction)delete:(id)sender

    y ponga en la lógica para eliminar la (s) fila (s) de vista de tabla.

Cuestiones relacionadas