如何在NSTableCellView中单击NSTextView时在NSTableView中选择一行?

时间:2012-04-17 02:00:26

标签: cocoa nstableview nstextview

我有一个基于视图的单列NSTableView。在我的NSTableCellView子类中,我有一个可选的NSTextView,但不可编辑。

当用户直接点击NSTableCellView时,该行会正确突出显示。但是当用户点击NSTableCellView内的NSTextView时,该行不会突出显示。

如何将NSTextView上的点击传递给NSTableCellView以使该行突出显示?

类层次结构如下所示: NSScrollView> NSTableView> NSTableColumn> NSTableCellView> NSTextView

3 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:1)

或使用NSTextField,然后使用

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

答案 2 :(得分:0)

我认为你在这里遇到了同样的问题:pass event on。 请参阅接受的答案。

遵循相同的模式,您将子类化NSTextView并覆盖- (void)mouseUp:(NSEvent *)theEvent以将事件传递给superView,我假设它是tableView:

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