スーパービューでマウスでドラッグできるさまざまなコンテンツを持つ、サブクラス化された多数の NSView (フレーム) を持つプログラムを作成しています。すべてのビューには contentView と呼ばれる 1 つのサブビューが含まれ、さらに複雑な階層を含むことができます。
contentView として編集不可の NSTextField がある場合、mouseDown: および mouseDragged: イベントは問題なくスーパービューに渡され、ドラッグは正常に機能します。
mouseDown: ---> [NSTextField] ---> [Frame]
mouseDragged: ---> [NSTextField] ---> [Frame]
contentView が多数の NSTextField を含む NSView のサブクラスである場合、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];
サブクラス化された NSTextField とサブクラス化された NSView の両方に mouseDragged: メソッドを追加しようとしましたが、メソッドを除外しました。どちらも違いはありませんでした。この問題は、同じサブビュー レベルにある他の NSControls にも存在します。
- (void)mouseDragged:(NSEvent *)theEvent
{
[super mouseDragged:theEvent];
}
また
- (void)mouseDragged:(NSEvent *)theEvent
{
[self.superview mouseDragged:theEvent];
}
現時点では、この動作はまったく直感的ではないように思えます。足りないものはありますか?(私は Mountain Lion で Xcode 4.6.2 を使用しています。)