Haga doble clic en una fila NSTableView en Cocoa?


Necesito que mi aplicación abra una ventana cuando un usuario haga doble clic en una fila en un NSTableView. Estoy teniendo un poco de dificultad para encontrar información o ejemplos sobre cómo lograr esto. ¿Alguien puede indicarme la dirección correcta?

Author: Jim Puls, 2009-03-07

7 answers

Echa un vistazo a la -setDoubleAction: método en NSTableView; puede establecer que a un método que se llamará al igual que el sistema de acción de destino normal, pero en un doble clic.

En ese método de acción, -clickedRow será útil.

 119
Author: Jim Puls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-06 22:18:18

Añadiendo más información básica a la respuesta de @JimPuls para el beneficio de otros recién llegados al Cacao.

  1. Un IBOutlet a NSTableView necesita ser declarado en una interfaz. Asumí 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 ello, Ctrl-Arrastrar y Soltar en IB desde la clase que declara la salida a la vista de tabla. Cuando sueltes el ratón, debería aparecer una ventana emergente con el nombre de la toma de corriente usted declaró en el paso #1. Selecciona eso.
  3. En la sección @implementation, en el método-awakeFromNib, llame a-setTarget: y-setDoubleAction: en el IBOutlet declarado en el paso #1 y conectado en el paso #2.

Aquí hay un extracto de mi delegado de vista de tabla. Tengo mi delegado también configurado como el datasource, por lo que verá las interfaces NSTableViewDelegate y NSTabeViewDataSource asociadas con él.

/ / Extracto de 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.

 54
Author: amateur barista,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-23 14:08:48

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

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

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

 10
Author: GeoffCoope,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-30 20:40:54

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

@IBOutlet weak var searchResultTable: NSTableView!

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

func doubleClickOnResultRow()
{
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}
 7
Author: Alfred Schilken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-22 20:28:27

Puede conectar la acción de doble clic en Interface Builder. Haga clic con el botón control en 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. Busque el elemento " doubleAction "en la sección" Acciones enviadas". Conéctelo a la IBAction de su elección.

 6
Author: rob mayoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-11 06:10:27

Puedes hacer lo mismo con los enlaces, en primer lugar declarar un mentod en .h file

-(IBAction)openWindow:(id)sender

In .m archivo implementar el mismo

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

Llegó a ese plumín donde está presente su vista de tabla, seleccione la vista de tabla y obtuvo la penúltima pestaña del inspector de atributos, abra el argumento de doble ciclo triángulo de divulgación compruebe bind para verificar el propietario del archivo fox select, la clave del modelo pat debe ser "self", el nombre del selector será " openWindow:", el mismo proceso lo hace con" Double click target", Esto funcionará

 0
Author: PR Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-23 13:19:17

En SWIFT 4.1 Puede configurar 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 se llama a 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 prepare for segue:

Bien primero en la interfaz Constructor:

introduzca la descripción de la imagen aquí

Por supuesto dar un identificador a ese segue:

introduzca la descripción de la imagen aquí

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

 //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 necesita ser visible para Objective C (incluso que estamos programando en Swift) simplemente iniciamos la función con @Objc eso es se.

@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 al método doubleAction de tableView en la parte de configuración inicial de nuestro código de la siguiente manera:

override func viewDidLoad() {
    super.viewDidLoad()
    thisTableView.doubleAction = #selector(doubleClickOnResultRow)
}
 0
Author: Ryuuzaki Julio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-06 03:41:57