cocoa nstableview double-click

Haga doble clic en una fila NSTableView en Cocoa?



double-click (7)

Agregando más información básica a @JimPuls, responde en beneficio de otros recién llegados a Cocoa.

  1. Un IBOutlet para NSTableView debe declararse en una interfaz. Supuse que es preferible hacerlo en el delegado de la mesa.
  2. El IBOutlet a la tabla debe conectarse a través de Interface Builder. Para hacer eso, Ctrl-Drag & Drop en IB de la clase que declara la salida 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 a -setTarget: y -setDoubleAction: en 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

// Extracto de implementación.

@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.

Necesito que mi aplicación abra 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?


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

  1. Seleccione su vista de tabla en IB y, a continuación, en el inspector de enlaces configure estas dos vinculaciones 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:

Donde myMethod se implementa como

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

Esto también está documentado aquí: https://developer.apple.com/library/mac/qa/qa1472/_index.html


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 ese método de acción, -clickedRow será útil.


En SWIFT 4.1, configura el método doubleAction del objeto TableView dentro de su código para realizar una función @objc utilizando un #selector (nameOfYourFunction)

Dentro de esta función, usted llama un segue. Puede vincular su nueva ventana a la ventana de origen en InterfaceBuilder (no al objeto NSTableView sino al objeto ViewController real.

Luego haga toda su configuración para la nueva ventana en preparación para segue:

Bien primero en Interface Builder:

Por supuesto, dale un identificador a esa transición:

A continuación, dentro de nuestro código de controlador de primera vista (donde está la vista de tabla):

//We use this function: prepare for segue override func prepare(for segue: NSStoryboardSegue, sender: Any?) { // check if we are referring to the actual segue we want if segue.identifier?.rawValue == "segueToYourNewWindow" { // now create a reference to that new window let yourNewWindow = segue.destinationController as! newWindowViewController // now change variables inside that view controller code, remember that the objects might fail if they are not yet visible to the user so first set up the variables or call them using the main thread, up to your design. yourNewWindow.selectedRowVariable = thisTableView.clickedRow }

Entonces necesitamos una función para realizar el segue en el doble clic de la vista de tabla, esta función se llama con un #selector y, por lo tanto, debe ser visible para Objective C (incluso si estamos programando en Swift) simplemente comenzamos la función con @ Objc eso es todo.

@objc func doubleClickOnResultRow() { //beware of double-clicking also triggers this function when no rows is selected with the selectedRow being -1 if (thisTableView.selectedRow > -1 ) { performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "segueToYourNewWindow"), sender: nil) } }

Finalmente establecemos esta función en el método doubleAction de TableView en la parte de configuración inicial de nuestro código de esta manera:

override func viewDidLoad() { super.viewDidLoad() thisTableView.doubleAction = #selector(doubleClickOnResultRow) }


Puede conectar la acción de doble clic en Interface Builder. 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.


Puede hacer lo mismo con los enlaces, antes que nada, declare uno en el archivo .h

-(IBAction)openWindow:(id)sender

en el archivo .m implementar el mismo

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

Llegué a esa punta donde está tu vista de tabla, seleccioné la vista de tabla y obtuve la segunda última pestaña del inspector de atributos, abrí el argumento de doble ciclista. Verificación de triángulo para verificar el propietario del archivo de selección de zorro. La clave de modelo del modelo debería ser "propia". nombre será "openWindow:", el mismo proceso de divulgación de "Doble clic de destino", esto funcionará


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)") }