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