2009-03-06 17 views
62

Necesito mi aplicación para abrir una ventana cuando un usuario hace doble clic en una fila en un NSTableView. Estoy teniendo dificultades para encontrar información o ejemplos sobre cómo lograr esto. ¿Alguien puede señalarme en la dirección correcta?Haga doble clic en una fila NSTableView en Cocoa?

Respuesta

117

Eche un vistazo al método -setDoubleAction: en NSTableView; puede configurarlo para un método que se llamará igual que el sistema de acción de destino normal, pero haciendo doble clic. En este método de acción, -clickedRow será útil.

+7

¿Hay alguna forma de conectar esto a través de IB? –

+21

Recuerde también establecer el destino para la vista de tabla con setTarget :, tonto, pero puede pasarse por alto – nduplessis

+1

Debe implementar -setDoubleAction: como un método delegado, o debe crear un IBOutlet iVar en la tabla, y llamar -setDoubleAction: en el iVar? –

55

Agregando más información básica a @JimPuls respuesta para el beneficio de otros recién llegados a Cocoa.

  1. Se debe declarar una IBOutlet a NSTableView en una interfaz. Supuse que es preferible hacerlo en el delegado de la mesa.
  2. El IBOutlet de la tabla debe conectarse a través de Interface Builder. Para hacer eso Ctrl-Drag & Suelta IB de la clase que declara el punto de venta a la vista de tabla. Cuando suelte el mouse, aparecerá una ventana emergente con el nombre del outlet que declaró en el paso # 1. Seleccione eso.
  3. En la sección @implementation, en el método -awakeFromNib, llame -setTarget: y -setDoubleAction: en el IBOutlet declarado en el paso n. ° 1 y conectado en el paso n. ° 2.

Aquí hay un extracto de mi delegado de vista de tabla. Mi delegado también se configuró como fuente de datos, por eso verá las interfaces NSTableViewDelegate y NSTabeViewDataSource asociadas.

// Extracto de la interfaz.

@interface MyTableViewDelegate : NSObject <NSTableViewDelegate, NSTableViewDataSource> 
{ 
    // This iVar needs to be connected to the table view via the IB. 
    IBOutlet NSTableView *tableOutlet; 
} 

@property (assign) IBOutlet NSTableView *tableOutlet; 

- (void)doubleClick:(id)nid; 

@end 

// Implementation excerpt.

@implementation MyTableViewDelegate 

@synthesize tableOutlet = _tableOutlet; 

- (void)awakeFromNib { 
    [_tableOutlet setTarget:self]; 
    [_tableOutlet setDoubleAction:@selector(doubleClick:)]; 
} 

- (void)doubleClick:(id)object { 
    // This gets called after following steps 1-3. 
    NSInteger rowNumber = [_tableOutlet clickedRow]; 
    // Do something... 
} 

Espero que esto ayude.

0

Usted puede hacer lo mismo con las fijaciones, en primer lugar declarar una mentod en el archivo .h

-(IBAction)openWindow:(id)sender 

en el archivo .m implementar la misma

-(IBAction)openWindow:(id)sender 
{ 
    //do something here; 
} 

que tiene que plumín donde su la vista de tabla está presente, seleccione la vista de tabla y obtuvo la segunda última pestaña del inspector de atributos, abra el argumento de doble ciclista abreviatura triángulo compruebe el enlace para verificar el propietario del archivo de selección de zorro, la clave de modelo pat debe ser "propia", el nombre del selector será "abrirWindow: ", el mismo proceso lo hago con el descubrimiento" Double click target " re, Esto funcionará

10

Como dijo PR Singh, puede usar enlaces de cacao, también puede pasar los objetos seleccionados.

  1. Seleccione su Tabla de IB a continuación en enlaces inspector de establecer estos dos enlaces de la siguiente manera:

    >Double Click Target 
    
    bind to = Application delegate object (or file owner) 
    model key path = self 
    selector name = myMethod: 
    
    >Double Click Argument 
    
    bind to = array controller 
    controller key = selectedObjects 
    selector name = myMethod: 
    

Dónde myMethod se implementa como

- (void)myMethod:(NSArray*)selectedObjects 
     { 
     NSLog(@"%@", selectedObjects); 
     } 

Ésta es también documentado aquí: https://developer.apple.com/library/mac/qa/qa1472/_index.html

+0

Funcionó como un amuleto. – groomsy

6

Si alguien busca una versión 2.0 rápida: Esto es lo que funciona para mí. Parece mucho más fácil que el código Objective C.

@IBOutlet weak var searchResultTable: NSTableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    searchResultTable.doubleAction = "doubleClickOnResultRow" 
} 

func doubleClickOnResultRow() 
{ 
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)") 
} 
+0

Esto es realmente útil. Para aquellos que quieran saber más sobre 'doubleAction', revisen este [enlace] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/index.html#//apple_ref/occ/instp/NSTableView/doubleAction). –

+0

Para Swift 3, el selector de función sería 'searchResultTable.doubleAction = #selector (doubleClickOnResultRow)' –

6

Puede conectar la acción de doble clic en Interface Builder. Haga clic y mantenga presionada la vista de tabla (asegúrese de obtener la vista de tabla , no la vista de desplazamiento o la vista de clip o una columna de tabla) para obtener su panel de conexiones. Encuentre el elemento "doubleAction" en la sección "Acciones enviadas". Conéctelo a IBAcción de su elección.

+0

Easy squeezy lemon peasy. Puede hacer clic en la fila desde el método clickedRow de la vista de tabla. Aún necesita la toma descrita en la respuesta número dos. –

+0

No necesita necesariamente una toma de corriente conectada a la vista de tabla, porque la vista de tabla se proporciona como el argumento emisor del mensaje de acción. –

+0

Ojalá hubiera visto esto antes de cavar en mi propio reconocedor de gestos ... – ghostatron

Cuestiones relacionadas