没有向下传递两个子视图



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

如果我有一个不可编辑的NSTextField作为contentView的mouseDown:和mousedrag:事件传递给它的父视图没有问题,拖动工作得很好

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

如果contentView是NSView的子类,而NSView又包含了一些NSTextFields,那么mousedrag:事件不会从NSTextFields传递给父视图。

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];

我试过添加一个mousedrag:方法到两个子类的NSTextField和子类的NSView,以及离开方法。两者都没有区别。在同一子视图级别的其他nscontrol也存在这个问题。

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

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

目前,这种行为对我来说似乎完全不直观。我是不是漏掉了什么?(我在Mountain Lion上使用Xcode 4.6.2)

NSTextView对鼠标有特殊的处理。不确定NSTextField,但它可能会表现出相同的行为。例如,没有mouseUp事件。mouseDown事件进入一个局部循环(可能用于拖动内容)。你可以尝试在你的类中重写mouseDown并调用NSView的mouseDown来绕过NSTextField的mouse down。

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

我通过检查NSView是否已经被激活用于拖动来解决这个问题,这是我一开始就应该做的。所以,我的错误,没有人可以解决没有我的整个源代码。

最新更新