2012-04-17 19 views
5

Tengo un NSTableView de una sola columna basado en vista. Dentro de mi subclase NSTableCellView tengo un NSTextView que es seleccionable, pero no editable.¿Cómo seleccionar una fila en un NSTableView al hacer clic en un NSTextView dentro de un NSTableCellView?

Cuando el usuario hace clic en NSTableCellView directamente, la fila se resalta correctamente. Pero cuando el usuario hace clic en NSTextView dentro de NSTableCellView, la fila no se resalta.

¿Cómo obtengo el clic en NSTextView para pasar al NSTableCellView para que la fila se destaque?

Jerarquía de clases parece: NSScrollView> NSTableView> NSTableColumn> NSTableCellView> NSTextView

+0

no puede duplicar lo que están viendo. Cuando agrego un campo de texto a una celda basada en vista, al hacer clic en él, selecciona la fila, no el campo de texto (tengo que hacer clic nuevamente para que eso suceda). ¿Lo tienes vinculado a algo o estás usando una fuente de datos? – rdelmar

+0

Estoy usando NSTextView, no NSTextField. Sí, obtengo el mismo comportamiento que con los campos de texto, pero mi aplicación requiere textviews. – sam

Respuesta

6

Esto es lo que terminé haciendo. Hice una subclase de NSTextView y hizo caso omiso de mouseDown: de la siguiente manera ...

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    // Notify delegate that this text view was clicked and then 
    // handled the click natively as well. 
    [[self myTextViewDelegate] didClickMyTextView:self]; 
    [super mouseDown:theEvent]; 
} 

estoy reutilizando delegado estándar de NSTextView ...

- (id<MyTextViewDelegate>)myTextViewDelegate 
{ 
    // See the following for info on formal protocols: 
    // stackoverflow.com/questions/4635845/how-to-add-a-method-to-an-existing-protocol-in-cocoa 
    if ([self.delegate conformsToProtocol:@protocol(MyTextViewDelegate)]) { 
     return (id<MyTextViewDelegate>)self.delegate; 
    } 
    return nil; 
} 

Y en la cabecera ...

@protocol MyTextViewDelegate <NSTextViewDelegate> 
- (void)didClickMyTextView:(id)sender; 
@end 

En el delegado, implemente didClickMyTextView: para seleccionar la fila.

- (void)didClickMyTextView:(id)sender 
{ 
    // User clicked a text view. Select its underlying row. 
    [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:[self.tableView rowForView:sender]] byExtendingSelection:NO]; 
} 
+0

Limpio: dos acciones no conflictivas de un solo evento. Has hecho un patrón de diseño que podría aplicarse en muchas situaciones. – Wienke

+0

una respuesta para todos los problemas, gran solución. – mohacs

0

Creo que tiene esencialmente el mismo problema que tuve aquí: pass event on. Ver la respuesta aceptada.

Siguiendo el mismo patrón, que le subclase NSTextView y anular - (void)mouseUp:(NSEvent *)theEvent para pasar el caso a la Superview, que estoy asumiendo que es el tableView:

- (void)mouseUp:(NSEvent *)theEvent { 
    [superView mouseUp:theEvent]; 
} 
+1

Sin suerte. Sobrescribir mouseUp: y enviar el evento a la supervista no parece hacer nada. Luego probé sobre mouseDown y envié el evento a la supervista. Eso selecciona la fila, pero luego pierdo la capacidad de seleccionar texto (básicamente la funcionalidad del mouse de la vista de texto). Resolví esto como se describe en mi respuesta y no es muy diferente de lo que tenía en mente. – sam

1

O bien, utilizar un NSTextField, y luego,

textfield.bezeled = NO; 
textfield.drawsBackground = NO; 
textfield.editable = NO; 
textfield.selectable = YES; 
[textfield setRefusesFirstResponder: YES]; 
Cuestiones relacionadas