1

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

如果我有一个不可编辑的 NSTextField 作为 contentView,则 mouseDown: 和 mouseDragged: 事件将毫无问题地传递到其超级视图,并且拖动工作正常。

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

如果 contentView 是 NSView 的子类,而该子类又包含许多 NSTextField,则 mouseDragged: 事件不会从 NSTextField 传递到父视图。

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。)

4

2 回答 2

2

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

于 2013-04-20T09:50:50.137 回答
1

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

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

于 2013-04-21T07:26:54.543 回答