我正在编写一个程序,该程序具有许多子类 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。)