在NSWindow的挂钩活动

时间:2013-04-10 08:15:11

标签: cocoa nswindow nswindowcontroller

我正在NSWindow制作弹出工具提示,就像关注XCode工具提示

enter image description here

如果用户按下按钮,则会显示弹出窗口。这很容易。

但在此之后,如果用户按下此窗口中的任何按钮,则应隐藏弹出窗口。

但是如果用户按下按钮,则不会调用nswindow的mousedown :.因此nswindowcontroller无法接收该事件。

nswindow如何检测窗口区域中的所有事件?

1 个答案:

答案 0 :(得分:1)

您可以为小窗口创建一个contextMenu,它会在您的操作上打开。

* 注意:在图片中,这是一个自定义视图,而不是contextMenu。*

- (IBAction)button:(id)sender {
    NSRect frame = [(NSButton *)sender frame];
    NSPoint menuOrigin = [[(NSButton *)sender superview] convertPoint:NSMakePoint(frame.origin.x+80, frame.origin.y+frame.size.height-10)
                                                               toView:nil];
    NSEvent *event =  [NSEvent mouseEventWithType:NSLeftMouseDown
                                         location:menuOrigin
                                    modifierFlags:NSLeftMouseDownMask // 0x100
                                        timestamp:0.0
                                     windowNumber:[[(NSButton *)sender window] windowNumber]
                                          context:[[(NSButton *)sender window] graphicsContext]
                                      eventNumber:0
                                       clickCount:1
                                         pressure:1];
    NSMenu *menu = [[NSMenu alloc] init];
    [menu setAutoenablesItems:NO];
    [menu insertItemWithTitle:@"Add Favorite"
                       action:@selector(addFavorite:)
                keyEquivalent:@""
                      atIndex:0];
    [menu insertItem:[NSMenuItem separatorItem] atIndex:1];
    [menu insertItemWithTitle:@"Manage Favorite"
                       action:@selector(manageFavorite:)
                keyEquivalent:@""
                      atIndex:2];
      [NSMenu popUpContextMenu:menu withEvent:event forView:(NSButton *)sender];
}

-(IBAction)addFavorite:(id)sender{
    NSLog(@"add");
}

-(IBAction)manageFavorite:(id)sender{
    NSLog(@"mangage");
}