2012-10-01 31 views
0

我有一个NSTextField,它由一个自定义视图嵌套,我想更改一行中多次点击的默认行为(双击,tripple点击等),类似于文本节点MindNode的行为(请参阅下图)。更改NSTextField在连续多次点击中的行为

我想要第一次点击“激活”文本字段,然后从头开始(如重置事件的点击次数)。

我有以下想法,但我不知道如何实现他们,如果他们真的有意义:

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

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

感谢您的回答!

这是问题的图形表示: Changing the behavior of multiple click for NSTextField

+0

那么,你想要的第一次点击做任何事情?为什么你想这样做,似乎你只是添加一个无用的点击。 – rdelmar

+0

它实际上是使文本字段“活动”,以便它可以像正常的NSTextField一样处理。此外,它会做某种视觉事物(类似于图片中的MindNode解决方案),但这不是问题。 –

+0

MindNode中的第一次点击/点击选择节点本身。这意味着要对整个节点的图形表示进行操作(请注意第三个图像的第二阶段中的调整大小手柄)。下一次单击将重点关注节点的字段。 –

回答

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其减小事件的点击计数类中的方法。

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]; 
} 
+0

感谢您的回应!我已经在文本字段前使用透明的自定义视图实现了它,并在'''mouseDown:'''中重新排序。问题是第二次点击的点击次数仍然等于2,而NSTextField选择一个单词而不是将光标放在点击的位置。任何想法如何改变它? –

+0

我不确定你为什么看到这种行为,我的行为并不这样做。我做的另一件事是将窗口的第一响应者设置为applicationDidFinishLaunching方法中的叠加层。我编辑了我的帖子以显示我的覆盖代码。 – rdelmar

+0

我用你的解决方案试过了,我几乎在那里,但它没有按预期工作。我认为在图层处于后台时出现多次点击并处理图层点击的问题。我找到了一个更简单的解决方案,并在此发布再次感谢您的建议。 –