2012-04-17 2 views
5

У меня есть одностолбцовый NSTableView. Внутри моего подкласса NSTableCellView у меня есть NSTextView, который можно выбрать, но не редактировать.Как выбрать строку в NSTableView при нажатии на NSTextView внутри NSTableCellView?

Когда пользователь нажимает на NSTableCellView напрямую, строка выделяется правильно. Но когда пользователь нажимает на NSTextView внутри этого NSTableCellView, строка не выделяется.

Как получить щелчок по NSTextView для перехода к NSTableCellView, чтобы подсветка строки?

Иерархия классов выглядит следующим образом: NSScrollView> NSTableView> NSTableColumn> NSTableCellView> NSTextView

+0

Я не могу дублировать то, что вы видите. Когда я добавляю текстовое поле в ячейку, основанную на представлении, нажатие на нее выбирает строку, а не текстовое поле (я должен снова щелкнуть, чтобы это произошло). Вы привязаны к чему-либо, или используете источник данных? – rdelmar

+0

Я использую NSTextView, а не NSTextField. Да, я получаю то же поведение, что и с текстовыми полями, но мое приложение требует текстовых просмотров. – sam

ответ

6

Вот что я в конечном итоге делает. Я сделал подкласс NSTextView и отменяют MouseDown: как следует ...

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

Я повторно использовать стандартный делегат 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; 
} 

И в заголовке ...

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

В делегате я реализую didClickMyTextView: для выбора строки.

- (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 - два бесконфликтных действия из одного события. Вы создали шаблон дизайна, который может применяться во многих ситуациях. – Wienke

+0

один ответ для всех проблем, отличное решение. – mohacs

0

Я думаю, что у вас есть по существу ту же самую проблему, которую я имел здесь: pass event on. См. Принятый ответ.

Следуя той же схеме, вы бы подкласс NSTextView и переопределить - (void)mouseUp:(NSEvent *)theEvent передать событие на к SuperView, который я предполагаю, что это Tableview:

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

Не повезло. Переопределение mouseUp: и отправка события в супервизор, похоже, ничего не делает. Затем я попытался переопределить mouseDown: и отправить событие в супервизор. Это делает выбор строки, но затем я теряю возможность выбора текста (в основном, функции мыши textview). Я решил это, как описано в моем ответе, и это не слишком отличается от того, что вы имели в виду. – sam

1

или используйте NSTextField, а затем,

textfield.bezeled = NO; 
textfield.drawsBackground = NO; 
textfield.editable = NO; 
textfield.selectable = YES; 
[textfield setRefusesFirstResponder: YES]; 
Смежные вопросы