Pregunta

Necesito que mi aplicación abra una ventana cuando un usuario haga doble clic en una fila en un NSTableView . Me está costando un poco encontrar información o ejemplos sobre cómo lograr esto. ¿Alguien puede señalarme en la dirección correcta?

¿Fue útil?

Solución

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

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

Otros consejos

Agregar 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 tabla.
  2. El IBOutlet a la mesa debe estar conectado a través de Interface Builder. Para hacer eso Ctrl-Drag & amp; Ingrese IB de la clase que declara la salida a la vista de tabla. Cuando suelte el mouse, aparecerá una ventana emergente con el nombre de la salida que 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. También tengo mi delegado configurado como fuente de datos, por eso verá las interfaces NSTableViewDelegate y NSTabeViewDataSource asociadas a é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

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

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

  1. Seleccione su Vista de tabla en IB y luego 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 se documenta aquí: https://developer.apple.com/library/mac/qa/ qa1472 / _index.html

Si alguien busca una versión Swift 2.0: Esto es lo que me funciona. Parece mucho más fácil que el código de Objective C.

@IBOutlet weak var searchResultTable: NSTableView!

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

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

Puede conectar la acción de doble clic en el generador de interfaz. Mantenga presionada la tecla Control y haga clic en su 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.

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

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

A continuación, realice toda la configuración de la nueva ventana para prepararse para segue:

Bien primero en Interface Builder:

 ingrese la descripción de la imagen aquí

Por supuesto, proporcione un identificador a esa secuencia:

 ingrese 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
        }

Luego, necesitamos una función para realizar el segue en el doble clic de la vista de tabla, esta función se llama con #selector y, por lo tanto, debe ser visible para el Objetivo C (incluso que estamos programando en Swift) simplemente iniciamos el funcionar 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 configuramos esta función al 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 hacer lo mismo con los enlaces, en primer lugar declarar un mentod en el archivo .h

-(IBAction)openWindow:(id)sender

en el archivo .m implementa lo mismo

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

llegué a esa punta donde está presente la vista de tabla, seleccione la vista de tabla y obtuve la segunda última pestaña del inspector de atributos, abra el doble triángulo argumento revelación triángulo verificación para verificar el propietario del archivo fox select, modelo pat clave debe ser " self " ;, el nombre del selector será " openWindow: " ;, el mismo proceso que se hace con " Target de doble clic " revelación, Esto funcionará

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top