Я пишу программу, которая имеет несколько подклассов NSView (Frame) с различным содержимым, которые можно перетаскивать мышью в их супервизоре. Все представления содержат одно подпредставление, называемое contentView, которое, в свою очередь, может содержать более сложную иерархию.
Если у меня есть нередактируемый NSTextField в качестве contentView, события mouseDown: и mouseDragged: передаются в его супервизор без проблем, и перетаскивание работает нормально.
mouseDown: ---> [NSTextField] ---> [Frame]
mouseDragged: ---> [NSTextField] ---> [Frame]
Если contentView является подклассом NSView, который, в свою очередь, содержит несколько NSTextFields, событие mouseDragged: не передается из 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];
Я попытался добавить метод mouseDragged: как к подклассу NSTextField, так и к подклассу NSView, а также отказался от этого метода. Ни то, ни другое не имело значения. Проблема также существует с другими NSControls, которые находятся на том же уровне subview.
- (void)mouseDragged:(NSEvent *)theEvent
{
[super mouseDragged:theEvent];
}
or
- (void)mouseDragged:(NSEvent *)theEvent
{
[self.superview mouseDragged:theEvent];
}
На данный момент мне такое поведение кажется совершенно не интуитивным. Что-то мне не хватает? (Я работаю с Xcode 4.6.2 на Mountain Lion.)