很難確切知道最好的方法,因爲我不知道你的應用程序做了什麼,但這是一個想法。聽起來你想通過視圖層次傳遞消息......不知何故。
無論如何,一個視圖會做兩件事情之一:
- 處理消息
- 把它傳遞給「下一個視圖」(你如何定義「下一個視圖」取決於你的應用程序)
所以。你會如何做到這一點?視圖的默認行爲應該是將消息傳遞給下一個視圖。實施這種事情的一個好方法是通過一個非正式協議。
@interface NSView (MessagePassing)
- (void)handleMouseDown:(NSEvent *)event;
- (NSView *)nextViewForEvent:(NSEvent *)event;
@end
@implementation NSView (MessagePassing)
- (void)handleMouseDown:(NSEvent *)event {
[[self nextView] handleMouseDown:event];
}
- (NSView *)nextViewForEvent:(NSEvent *)event {
// Implementation dependent, but here's a simple one:
return [self superview];
}
@end
現在,應該有這種行爲的看法,你可以這樣做:
- (void)mouseDown:(NSEvent *)event {
[self handleMouseDown:event];
}
- (void)handleMouseDown:(NSEvent *)event {
if (/* Do I not want to handle this event? */) {
// Let superclass decide what to do.
// If no superclass handles the event, it will be punted to the next view
[super handleMouseDown:event];
return;
}
// Handle the event
}
你可能會想創建一個子類NSView
覆蓋mouseDown:
,你會那麼您基地等自定義視圖類。
如果您想根據實際z順序確定「下一個視圖」,請記住,z順序由subviews
集合內的順序決定,後面的視圖首先出現。所以,你可以做這樣的事情:
- (void)nextViewForEvent:(NSEvent *)event {
NSPoint pointInSuperview = [[self superview] convertPoint:[event locationInWindow] fromView:nil];
NSInteger locationInSubviews = [[[self superview] subviews] indexOfObject:self];
for (NSInteger index = locationInSubviews - 1; index >= 0; index--) {
NSView *subview = [[[self superview] subviews] objectAtIndex:index];
if (NSPointInRect(pointInSuperview, [subview frame]))
return subview;
}
return [self superview];
}
這可能比你想要的方式更多,但我希望它能幫助。
這是一個非常有趣的答案,我很可能會使用你的答案的第二部分,它似乎是一個很好的方式來獲得基於他們的Z順序的意見。謝謝! – Form