我正在編寫一個程序,該程序具有不同內容的子類NSView(框架)的數量,可以通過鼠標在其超級視圖中拖動。所有視圖都包含一個名爲contentView的子視圖,該視圖又可以包含更復雜的層次結構。mouseDragged:是不是傳遞了兩個子視圖?
如果我有一個不可編輯的NSTextField作爲contentView,那麼mouseDown:和mouseDragged:事件就會傳遞到它的超級視圖而沒有問題,並且拖動工作得很好。
mouseDown: ---> [NSTextField] ---> [Frame]
mouseDragged: ---> [NSTextField] ---> [Frame]
如果內容查看是一個NSView的子類,又包含了許多NSTextFields中的mouseDragged的:不從NSTextFields到上海華傳遞事件。
mouseDown: ---> [NSTextField] ---> [subclassed NSView] ---> [Frame]
mouseDragged: ---> [NSTextField] -x->
mouseDown:event被幀接收。單擊NSTextFields之間的間隙並直接拖動contentView即可正常工作。
的NSTextFields設置了這樣的內容查看:
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。)
我不知道我完全理解這種方法。如果NSTextField是移動的NSView的直接子視圖,拖動似乎工作正常。如果我介紹更深層次的問題,問題纔會開始。此外,由於NSTextField是NSResponder的子類,不會像我原來的問題中提到的那樣覆蓋mouseDown/mouseDragged/mouseUp來解決它嗎? – 2013-04-21 04:18:59
看來,如果我覆蓋mouseDown:在NSTextField中,不要調用mouseDown:在任何其他視圖中,mouseDragged:和mouseUp:都會被調用併發送到超級視圖。當然,在這種情況下,我無法啓動拖動。 – 2013-04-21 05:48:15
我試着從鏈接中實現你的提示,但是應用程序與「地址不包含指向對象文件中的節的節」的通知一起墜毀。我的mouseDown代碼是: '方法nsviewMouseDownMethod = class_getClassMethod([NSResponder class],@selector(mouseDown :)); IMP mouseDownImplememtation = method_getImplementation(nsviewMouseDownMethod); mouseDownImplememtation(self.superview,@selector(mouseDown :));' – 2013-04-21 05:52:28