2012-04-18 8 views
7

¿Cómo se obtiene la fila de un botón en una tabla basada en vista al hacer clic en el botón? La fila no se selecciona cuando se hace clic en el botón, pero descubrí que si registra sender.superview.superview en el método de acción del botón, obtengo: NSTableRowView: 0x1001b3a90 - row: 2. Entonces, la fila está allí en el registro, pero no sé cómo hacerlo programáticamente. Tengo el método de acción del botón en una subclase de NSTableCellView.Obtener la fila del botón en la tabla basada en la vista

Respuesta

8

-[NSTableView rowForView:] dice esto en su documentación:

Esto normalmente se necesita en el método de acción para una NSButton (o NSControl) para averiguar qué fila (y la columna) la acción se debe realizar en.

+0

Gracias, esto es lo que necesitaba. Puedo obtener la vista de tabla en el método de acción del botón desde sender.superview.superview.superview y la vista desde sender.superview – rdelmar

+0

La acción debe enviarse a un controlador y ese controlador debe conocer la vista de tabla. Debería tener una salida. Por lo tanto, no debería necesitar seguir la cadena de superview. Y, simplemente puede pasar 'sender' como argumento a' -rowForView: ', ya que busca la fila que contiene, directa o indirectamente, la vista. –

+0

Estaba haciendo algunas pruebas solo para ver cómo podía manipular varios elementos de IU en una tabla basada en vistas, así que inicialmente, tenía el método de acción en el delegado de la aplicación (por simplicidad) y nunca se llamó. Luego lo puse en la vista de celda de la tabla personalizada porque leí en alguna parte que ahí es donde debería estar. Como dijiste en tu comentario, realmente parece que debería estar en un objeto controlador, pero ¿hay alguna restricción sobre dónde puede ir para que funcione? ¿Por qué no funcionó en el delegado de la aplicación? No estoy seguro de cómo se ve la cadena de respuesta para una tabla basada en vista. – rdelmar

1

Aquí les doy un ejemplo simple. En esto estoy agregando un UIButton en la vista de contenido. Cuando hace clic en el botón que llama a un método y no consigo el número de filas y llamo como yo requería

//Adding a button 
    UIButton *btnBuyer=[UIButton buttonWithType:UIButtonTypeCustom]; 
    btnBuyer.frame=CGRectMake(238, 10, 26, 32); 
    btnBuyer.tag=indexPath.row; 
    [btnBuyer setImage:[UIImage imageNamed:@"buyIcon.png"] forState:UIControlStateNormal]; 
    [btnBuyer addTarget:self action:@selector(goBuyTab:)forControlEvents:UIControlEventTouchUpInside]; 
    [cellNew.contentView addSubview:btnBuyer]; 

Y cuando el usuario haga clic en este llegué ID desde el siguiente método

-(void)goBuyTab:(UIButton *)sender{ 
    NSLog(@"after click buy button function called goBuyTab"); 
    NSLog(@"sender.tag in goBuyTab : %d",sender.tag); 
    int selectedRow=sender.tag;// This is row number 
} 

Hope esto es lo que requieres

-1

en OSX puede utilizar esto en su método de acción pila de botón en el controlador:

- (IBAction)yourMethod:(NSButtonCell *)sender { 

NSInteger selected = [yourTableView selectedRow]; 
NSLog(@"sender sends :%ld", selected); 
} 

debe configurar una salida desde el controlador a la NSTableView.

+0

Esto no siempre funciona porque es perfectamente posible hacer clic en un botón en una fila sin seleccionar la fila subyacente. – Ely

+0

Tampoco funciona porque (en una vista de tabla basada en celdas) 'sender' es' NSTableView', no 'NSButtonCell'. –

0

que comparten el código de Swift 4.

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 
    ........ 
    but.action = #selector(ViewController.buttonAction) 
    ......... 
} 

@objc func buttonAction(but: NSButton){ 
    let tablerow: NSTableRowView = but.superview?.superview as! NSTableRowView; 
    let index = table?.row(for: tablerow); 
    print("\(index)); 
} 
Cuestiones relacionadas