No MouseUp:/ Down:在Leopard上的NSSplitView中的自定义视图上

时间:2010-08-11 22:12:53

标签: cocoa nsview osx-leopard nssplitview

我目前正致力于OSX 10.5及更高版本的项目构建。 首先,10.6用户没有看到这一点;只有10.5个用户遇到此问题。 您无法在10.6上重现此内容。

简而言之:当放置一个自定义扩展类的NSView时,重载实现为 - (void)mouseUp:(NSEvent *)theEvent,当它包装在NSSplitView中时,不会调用mouseUp。 rightMouseUp:/ Down:可以在扩展的NSView上工作。

当我将自定义视图放在我的窗口上时会调用该事件,当我将它直接包装在nssplitview中时,不会为leopard(10.5)用户调用mouseup。

重现步骤(10.5!)

  1. 创建一个新的可可项目
  2. 创建以下类
  3. 在窗口上拖动自定义视图并创建GTTest类
  4. 在窗口上拖动splitview,只需在其中一个内容视图中添加GTTest
  5. 类别:

    @interface GTTest : NSView {
    }
    
    #import "GTTest.h"
    @implementation GTTest
    
    - (void)mouseUp:(NSEvent *)theEvent {
     NSLog(@"Ger");
    }
    

    单击窗口上的GTTest direclty会记录好的行,单击NSSplitView就不会执行任何操作(尝试断点)。 rightMouseDown:/ Up:可以在NSView上运行。

    PS>当我向splitview添加一个按钮时(也是一个派生的nsview,使用nsresponder吗?)DOES激活我的IBAction方法;我的班级上面缺少什么才能正常工作?

    我该怎么办?

2 个答案:

答案 0 :(得分:1)

好的,我找到了解决方法:

实现NSSplitView的扩展类并覆盖方法,并且如果分割器悬停(通过游标可检测)并且如果不执行任何操作,则“冒泡”事件。这不会导致自定义视图接收事件。

- (void)mouseUp:(NSEvent *)theEvent {
    if ([NSCursor currentCursor]==[NSCursor resizeLeftCursor] 
        || [NSCursor currentCursor]==[NSCursor resizeRightCursor]
        || [NSCursor currentCursor]==[NSCursor resizeLeftRightCursor]) {
        [super mouseUp:theEvent];
    } 

    if ([NSCursor currentCursor]==[NSCursor resizeUpCursor] 
        || [NSCursor currentCursor]==[NSCursor resizeDownCursor]
        || [NSCursor currentCursor]==[NSCursor resizeUpDownCursor])
    {
        [super mouseUp:theEvent];
    }
}

并使用该类作为splitview;突然,事件被接收到自定义NSViews。 奇怪但真实!

答案 1 :(得分:0)

我不知道为什么10.5和10.6会在这方面有所不同,但您可能会尝试重写mouseDownCanMoveWindow以返回NO,如此问题:

mouse click events in an NSView subclass