0

我有一个NSTextField由自定义视图嵌套的,我想更改连续多次单击的默认行为(双击、三次单击等),类似于文本节点 MindNode 的行为(见下图)。

我希望第一次单击以“激活”文本字段,然后从头开始(例如重置事件的单击计数)。

我有以下想法,但我不知道如何实现它们以及它们是否真的有意义:

  • 以某种方式更改使用时间+[NSEvent doubleClickInterval]并减慢第二次点击。
  • 以编程方式减少点击次数?
  • 使用 使 NSTextField 不可选择-hitTest:,将点击转发到超级视图,更改文本字段的某些参数并接受下一次点击。在这种情况下,第二次点击的点击次数仍然是 2。
  • 覆盖-mouseDown:而不是调用超级。这破坏了 NSTextField 的选择功能。

我希望有一种更简单的方法来实现这一点,但我忽略了这一点。

感谢您的回答!

这是问题的图形表示: 更改 NSTextField 的多次单击行为

4

2 回答 2

0

我会通过在 NSBox 中嵌入文本字段和自定义视图来做到这一点,它将设置为自定义类型,最初没有背景颜色或边框(因此它是不可见的)。最初,自定义视图将位于顶部,并且它会有一个 mouseDown: 方法来接收第一次点击。在该方法中,您可以重新排列框的子视图,以便文本字段位于顶部并接收下一次点击。如果您愿意,该框可能比文本字段大一些,因此您可以为其设置背景颜色或其他看起来像围绕文本字段的自定义激活环的绘图。在文本字段的 controlTextDidEndEditing: 方法中,您可以将系统重置回初始状态,以便下次单击它时准备好。

编辑后:这是我在覆盖类中使用的代码:

@implementation Overlay

static NSComparisonResult rdComparator( NSView *view1, NSView *view2, void *context ) {
    if ([view1 isKindOfClass:[NSTextField class]])
        return NSOrderedDescending;
    else if ([view2 isKindOfClass:[NSTextField class]])
        return NSOrderedAscending;
    return NSOrderedSame;
}


-(void)mouseDown:(NSEvent *)theEvent {
    self.box.fillColor = [NSColor redColor];
    NSView *contentView = self.box.subviews.lastObject;
    [contentView sortSubviewsUsingFunction:rdComparator context:nil];
}
于 2012-10-01T22:24:48.467 回答
0

我已经通过以NSTextField编程方式对鼠标按下事件的点击计数进行子类化和递减来解决它。使用子类的布尔属性,我可以打开和关闭这种特殊行为。

- (void)mouseDown:(NSEvent *)theEvent
{
    if (self.specialBehavior) {
        theEvent = [NSEvent mouseEventWithType:theEvent.type
                                      location:theEvent.locationInWindow
                                 modifierFlags:theEvent.modifierFlags
                                     timestamp:theEvent.timestamp
                                  windowNumber:theEvent.windowNumber
                                       context:theEvent.context
                                   eventNumber:theEvent.eventNumber
                                    clickCount:theEvent.clickCount - 1
                                      pressure:theEvent.pressure];
    }

    [super mouseDown:theEvent];
}

NSEvent为了简化这个长方法调用,我编写了一个减少事件点击次数的类别方法。

于 2012-10-06T13:16:51.927 回答