mouseDragged:是不是传递了两个子视图?

时间:2013-04-20 06:49:03

标签: cocoa mouseevent nstextview mousedown responder-chain

我正在编写一个程序,它有许多带有不同内容的子类NSView(Frame),可以通过鼠标在超级视图中拖动它们。所有视图都包含一个名为contentView的子视图,而子视图又可以包含更复杂的层次结构。

如果我有一个不可编辑的NSTextField作为contentView,则mouseDown:和mouseDragged:events会毫无问题地传递给它的superview,并且拖动工作正常。

mouseDown:    ---> [NSTextField] ---> [Frame]
mouseDragged: ---> [NSTextField] ---> [Frame]

如果contentView是NSView的子类,而NSView又包含许多NSTextField,则mouseDragged:事件不会从NSTextField传递给superview。

mouseDown:    ---> [NSTextField] ---> [subclassed NSView] ---> [Frame]
mouseDragged: ---> [NSTextField] -x-> 

框架接收mouseDown:事件。单击NSTextFields之间的间隙并直接拖动contentView即可。

NSTextFields在contentView中设置如下:

NSTextField *textfield = [[NSTextField alloc] initWithFrame:rect];
[textfield setBordered:NO];
[textfield setSelectable:NO];
[textfield setEditable:NO];
[textfield setTextColor:[NSColor blackColor]];
[textfield setBackgroundColor:[NSColor clearColor]];
[textfield setDrawsBackground:NO];
[textfield setAlignment:NSRightTextAlignment];
[textfield setFont:[NSFont fontWithName:@"Helvetica" size:14]];
[self addSubview:textfield];
[textfield release];

我尝试将一个mouseDragged:方法添加到子类NSTextField和子类NSView,以及将该方法保留。两者都没有区别。其他NSControl在同一子视图级别也存在问题。

- (void)mouseDragged:(NSEvent *)theEvent
{
    [super mouseDragged:theEvent];
}

- (void)mouseDragged:(NSEvent *)theEvent
{
    [self.superview mouseDragged:theEvent];
}

目前这种行为对我来说似乎完全不直观。有什么我想念的吗? (我在Mountain Lion上使用Xcode 4.6.2。)

2 个答案:

答案 0 :(得分:2)

NSTextView对鼠标有特殊处理。不确定NSTextField,但它可能表现出相同的行为。例如,没有mouseUp事件。 mouseDown事件进入本地循环(可能用于拖动内容)。您可以尝试覆盖类中的mouseDown,并调用NSView的mouseDown来绕过NSTextField的鼠标。有关如何执行此操作,请参阅this SO question

答案 1 :(得分:0)

好的,我找到了答案。它与任何阻止任何鼠标事件的NSTextFields无关。当我单击NSView时,调用例程来检查内容是否仍然准确。这将释放所有子视图并重新布局整个视图。这自然会切断同一子视图的mouseDown事件中的任何拖动事件(不再存在)。

我通过检查NSView是否已经被激活进行拖动来解决问题,我本来应该这样做。所以,没有我的整个源代码,我的错误和任何其他人都无法解决...