5

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

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

如何获得对 NSTextView 的点击以传递给 NSTableCellView 以便该行突出显示?

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

4

3 回答 3

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];
}
于 2012-04-25T01:54:02.423 回答
1

或者,使用 NSTextField,然后,

textfield.bezeled = NO;
textfield.drawsBackground = NO;
textfield.editable = NO;
textfield.selectable = YES;
[textfield setRefusesFirstResponder: YES];
于 2015-02-26T00:48:53.103 回答
0

我认为您基本上遇到了与我在这里遇到的问题相同的问题:将事件传递到. 请参阅已接受的答案。

按照相同的模式,您将继承 NSTextView 并覆盖- (void)mouseUp:(NSEvent *)theEvent以将事件传递给 superView,我假设它是 tableView:

- (void)mouseUp:(NSEvent *)theEvent {
    [superView mouseUp:theEvent]; 
}
于 2012-04-23T04:15:32.763 回答