Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 有没有办法绕过这个怪癖?_Objective C_Cocoa_Macos - Fatal编程技术网

Objective c 有没有办法绕过这个怪癖?

Objective c 有没有办法绕过这个怪癖?,objective-c,cocoa,macos,Objective C,Cocoa,Macos,我这里有个问题。我正在创建一个NSTrackingArea如下: NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self frame] options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:self userInfo:nil]; [self addTrackingArea:area]; [area release]; -(void)

我这里有个问题。我正在创建一个
NSTrackingArea
如下:

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self frame] options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:self userInfo:nil];
[self addTrackingArea:area];
[area release];
-(void)mouseEntered:(NSEvent *)event {
    [self toggleDetail];
}
-(void)mouseExited:(NSEvent *)event {
    [self toggleDetail];
}
- (void)toggleDetail {
if (!attachedWindow) {
    NSPoint buttonPoint = NSMakePoint(NSMidX([conditionImage frame]),
                                      NSMidY([conditionImage frame]));
    attachedWindow = [[MAAttachedWindow alloc] initWithView:view 
                                            attachedToPoint:buttonPoint 
                                                   inWindow:[self window] 
                                                     onSide:12
                                                 atDistance:10.0];
    //config removed because of irrelevance
    [[self window] addChildWindow:attachedWindow ordered:NSWindowAbove];
} else {
    [[self window] removeChildWindow:attachedWindow];
    [attachedWindow orderOut:self];
    [attachedWindow release];
    attachedWindow = nil;
}
这个很好用。然而,这里有一个问题。我把它设置成这样:

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self frame] options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:self userInfo:nil];
[self addTrackingArea:area];
[area release];
-(void)mouseEntered:(NSEvent *)event {
    [self toggleDetail];
}
-(void)mouseExited:(NSEvent *)event {
    [self toggleDetail];
}
- (void)toggleDetail {
if (!attachedWindow) {
    NSPoint buttonPoint = NSMakePoint(NSMidX([conditionImage frame]),
                                      NSMidY([conditionImage frame]));
    attachedWindow = [[MAAttachedWindow alloc] initWithView:view 
                                            attachedToPoint:buttonPoint 
                                                   inWindow:[self window] 
                                                     onSide:12
                                                 atDistance:10.0];
    //config removed because of irrelevance
    [[self window] addChildWindow:attachedWindow ordered:NSWindowAbove];
} else {
    [[self window] removeChildWindow:attachedWindow];
    [attachedWindow orderOut:self];
    [attachedWindow release];
    attachedWindow = nil;
}
toggleDetail
基本上是这样的:

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self frame] options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:self userInfo:nil];
[self addTrackingArea:area];
[area release];
-(void)mouseEntered:(NSEvent *)event {
    [self toggleDetail];
}
-(void)mouseExited:(NSEvent *)event {
    [self toggleDetail];
}
- (void)toggleDetail {
if (!attachedWindow) {
    NSPoint buttonPoint = NSMakePoint(NSMidX([conditionImage frame]),
                                      NSMidY([conditionImage frame]));
    attachedWindow = [[MAAttachedWindow alloc] initWithView:view 
                                            attachedToPoint:buttonPoint 
                                                   inWindow:[self window] 
                                                     onSide:12
                                                 atDistance:10.0];
    //config removed because of irrelevance
    [[self window] addChildWindow:attachedWindow ordered:NSWindowAbove];
} else {
    [[self window] removeChildWindow:attachedWindow];
    [attachedWindow orderOut:self];
    [attachedWindow release];
    attachedWindow = nil;
}
}

现在我的问题来了。当my
MAAttachedWindow
关闭时,我将鼠标移到窗口上,窗口将打开。花花公子然而,只有当我让鼠标远离
MAAttachedWindow
时,它才有好处。当我将鼠标移到它上面时(仍在主窗口上方),它就开始猛烈地打开和关闭
MAAttachedWindow

原因如下:一旦窗口打开,跟踪区域就会认为我的鼠标不再在窗口上方,因为弹出窗口就在它前面。然而,一旦它删除了弹出窗口,它就会认为我的鼠标又在它上面,从而再次创建和显示弹出窗口。因此,这是一个无止境的循环


我的问题是,如果有办法,它不能关闭窗口,除非我的鼠标在窗口和弹出窗口或类似的东西外面。有没有办法做到这一点?

请参见-[NSWindow setIgnoresMouseEvents:]

顺便说一句,使用重叠窗口时要非常小心。它们的困难在于,在创建它时,必须给它绝对坐标,并且存在一个小的竞争,父窗口可以在获得帧的时间和创建子窗口的时间之间移动。窗口移动是由窗口服务器完成的,并且可以独立于应用程序来完成(这就是为什么当应用程序在海滩上打球时可以移动窗口)。现在这是一个非常罕见的问题,但它是可能的,而且很难妥善解决它。如果在父窗口调整大小时尝试调整或移动子窗口,则问题更大


现在我意识到这些都不适用于您,但如果确实适用,并且您可以考虑使用子窗口的替代方案,我建议您使用它。

为什么只有在鼠标处于特定位置(跟踪区域为矩形)时才显示窗口?每次鼠标进入跟踪区域时,我都会说切换窗口状态。@Eimantas,因为弹出窗口更像是一个悬停和获取信息弹出窗口,而不是与之交互的窗口。然后我建议将其显示在跟踪区域的某个侧面。不在上面,否则光标会阻止信息窗口上的一些信息。@Eimantas:是的,我可以,但这不是我希望的解决方案。那么基本上可以确定事件来自哪个窗口吗?还没有尝试过,但看起来很完美!也谢谢你的警告。我会记在心里的。好吧,我得试试它,除了一件事之外,它工作得很好。如果我把鼠标移到窗口上,弹出窗口就会出现,然后我把鼠标移到弹出窗口上,它就不再做那种奇怪的抽搐了。但是,如果我将鼠标移到弹出窗口所在区域的窗口上,它仍然存在相同的问题。你知道为什么鼠标进入窗口会有不同吗?谢谢你的帮助!何时执行-[NSWindow setIgnoresMouseEvents:]调用?确保它在窗口可见之前。您可能会发现,您必须等到窗口服务器创建好窗口后,才能使其可见(这可能有点尴尬)。