Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 在NSTableCellView中单击NSTextView时,如何在NSTableView中选择行?_Cocoa_Nstableview_Nstextview - Fatal编程技术网

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

Cocoa 在NSTableCellView中单击NSTextView时,如何在NSTableView中选择行?,cocoa,nstableview,nstextview,Cocoa,Nstableview,Nstextview,我有一个基于视图的单列NSTableView。在我的NSTableCellView子类中,我有一个可选择但不可编辑的NSTextView 当用户直接单击NSTableCellView时,该行将正确高亮显示。但是,当用户单击NSTableCellView中的NSTextView时,该行不会高亮显示 如何让单击NSTextView传递到NSTableCellView以使行高亮显示 类层次结构如下所示: NSScrollView>NSTableView>NSTableColumn>NSTableCel

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

当用户直接单击NSTableCellView时,该行将正确高亮显示。但是,当用户单击NSTableCellView中的NSTextView时,该行不会高亮显示

如何让单击NSTextView传递到NSTableCellView以使行高亮显示

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

我认为您的问题与我在这里遇到的问题基本相同:。 见公认的答案

按照相同的模式,您将子类NSTextView并重写-voidmouseUp:NSEvent*theEvent以将事件传递给superView,我假设它是tableView:

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

这就是我最后做的。我创建了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;
}

或者,使用NSTextField,然后

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

我无法复制你看到的东西。当我向基于视图的单元格中添加文本字段时,单击它会选择行,而不是我必须再次单击的文本字段。您是否将它绑定到任何东西,或者您使用的是数据源?我使用的是NSTextView,而不是NSTextField。是的,我的行为和你对文本字段的行为一样,但我的应用程序需要文本视图。运气不好。重写mouseUp:并且将事件发送到superView似乎没有任何作用。然后我尝试覆盖mouseDown:并将事件发送到superView。这确实选择了行,但是我失去了选择文本的能力,基本上就是textview的鼠标功能。我确实解决了这个问题,正如我在回答中所描述的,它与你的想法没有太大的不同。整洁-一个事件中两个没有冲突的动作。您已经创建了一个可以应用于多种情况的设计模式。所有问题的一个答案,伟大的解决方案。
- (void)didClickMyTextView:(id)sender
{
    // User clicked a text view. Select its underlying row.
    [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:[self.tableView rowForView:sender]] byExtendingSelection:NO];
}
textfield.bezeled = NO;
textfield.drawsBackground = NO;
textfield.editable = NO;
textfield.selectable = YES;
[textfield setRefusesFirstResponder: YES];