2012-04-17 5 views
5

Ho un NSTableView single-column basato su visualizzazione. All'interno della mia sottoclasse NSTableCellView ho un NSTextView che è selezionabile, ma non modificabile.Come selezionare una riga in un NSTableView quando si fa clic su un NSTextView all'interno di NSTableCellView?

Quando l'utente fa clic direttamente su NSTableCellView, la riga viene evidenziata correttamente. Ma quando l'utente fa clic su NSTextView all'interno di NSTableCellView, la riga non viene evidenziata.

Come si ottiene il clic su NSTextView per passare a NSTableCellView in modo che la riga sia evidenziata?

gerarchia Classe assomiglia: NSScrollView> NSTableView> NSTableColumn> NSTableCellView> NSTextView

+0

non può duplicare quello che stai vedendo. Quando aggiungo un campo di testo a una cella basata sulla vista, facendo clic su di esso seleziona la riga e non il campo di testo (devo fare di nuovo clic per farlo accadere). Lo hai legato a qualcosa o stai usando una fonte di dati? – rdelmar

+0

Sto usando NSTextView, non NSTextField. Sì, ho lo stesso comportamento dei campi di testo, ma la mia applicazione richiede visualizzazioni di testo. – sam

risposta

6

Ecco quello che ho finito per fare. Ho fatto una sottoclasse di NSTextView e calpestato mouseDown: come segue ...

- (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]; 
} 

che sto riutilizzo delegato di serie di 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; 
} 

E nell'intestazione ...

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

Nel delegato, implemento didClickMyTextView: per selezionare la riga.

- (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

Neat - due azioni non in conflitto tra un singolo evento. Hai creato uno schema di progettazione che potrebbe essere applicato in molte situazioni. – Wienke

+0

una risposta per tutti i problemi, ottima soluzione. – mohacs

0

penso che tu abbia essenzialmente lo stesso problema che ho avuto qui: pass event on. Vedere la risposta accettata.

Seguendo lo stesso schema, si sottoclasse NSTextView e sovrascrivere - (void)mouseUp:(NSEvent *)theEvent di trasmettere l'evento al Superview, che sto assumendo è il tableView:

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

Nessuna fortuna. Override di mouseUp: e inviare l'evento alla superView non sembra fare nulla. Poi ho provato a scavalcare mouseDown: e inviare l'evento alla superView. Questo seleziona la riga, ma poi perdo la possibilità di selezionare il testo (fondamentalmente la funzionalità del mouse della textview). Ho risolto questo come descritto nella mia risposta e non è troppo diverso da quello che avevi in ​​mente. – sam

1

o, utilizzare un NSTextField, e poi,

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