我在NSOutlineView
. 编辑其中一个单元格需要单击、暂停和再次单击。第一次单击选择表格视图行,第二次单击在字段中绘制光标。双击单元格,您可以在基于单元格的表格视图中进行编辑,只选择行。
我想要的行为:一键更改选择和编辑。
我需要覆盖什么才能获得这种行为?
我读过其他一些帖子:
NSTextField
享元模式似乎不适用于基于视图的表格视图,其中单元格视图都是从 nib 实例化的。- 我尝试
NSTextField
像这个解决方案描述的那样进行子类化,但是没有调用我的覆盖mouseDown
方法。覆盖awakeFromNib
和(在这篇文章viewWillDraw
中提到)被调用。如果我将文本字段放在表格视图之外的某个地方,当然会调用它。mouseDown
相比之下,NSSegmentedControl
我的单元格视图中的 a 在没有先选择行的情况下更改了它的值。
这是根据接受的响应改编的工作解决方案:
在大纲视图子类中:
-(void)mouseDown:(NSEvent *)theEvent {
[super mouseDown:theEvent];
// Forward the click to the row's cell view
NSPoint selfPoint = [self convertPoint:theEvent.locationInWindow fromView:nil];
NSInteger row = [self rowAtPoint:selfPoint];
if (row>=0) [(CellViewSubclass *)[self viewAtColumn:0 row:row makeIfNecessary:NO]
mouseDownForTextFields:theEvent];
}
在表格单元格视图子类中:
// Respond to clicks within text fields only, because other clicks will be duplicates of events passed to mouseDown
- (void)mouseDownForTextFields:(NSEvent *)theEvent {
// If shift or command are being held, we're selecting rows, so ignore
if ((NSCommandKeyMask | NSShiftKeyMask) & [theEvent modifierFlags]) return;
NSPoint selfPoint = [self convertPoint:theEvent.locationInWindow fromView:nil];
for (NSView *subview in [self subviews])
if ([subview isKindOfClass:[NSTextField class]])
if (NSPointInRect(selfPoint, [subview frame]))
[[self window] makeFirstResponder:subview];
}