首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按住NSWindow键并单击外部以隐藏窗口

按住NSWindow键并单击外部以隐藏窗口
EN

Stack Overflow用户
提问于 2012-08-18 23:30:52
回答 3查看 4.9K关注 0票数 2

我正在做Mac编程的第一步。我只有很少的iOS开发经验。我需要建立非常简单的应用程序,坐在菜单栏中。我想让它有一点习惯,决定使用NSWindow并将其附加到NSStatusItem上。

我的AppDelegate看起来像这样:

代码语言:javascript
运行
复制
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application

    float width = 30.0;
    float height = [[NSStatusBar systemStatusBar] thickness];
    NSRect viewFrame = NSMakeRect(0, 0, width, height);
    statusItem = [[NSStatusItem alloc] init];
    statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:30];
    [statusItem setView:[[TSStatusBarItem alloc] initWithFrame:viewFrame]];


}

- (void)buttonClicked:(int)posx posy:(int)posy {
    [_window setLevel:kCGMaximumWindowLevelKey];
    opened = !opened;
    NSLog(@"Window is shown: %i", opened);

    [_window setFrameTopLeftPoint:NSMakePoint(posx, posy)];

    if(opened == YES) {
        _window.isVisible = YES;
    } else {
        _window.isVisible = NO;
    }

}

这是TSStatusBarItem的代码

代码语言:javascript
运行
复制
- (void)drawRect:(NSRect)rect
{
    // Drawing code here.

    if (clicked) {
        [[NSColor selectedMenuItemColor] set];
        NSRectFill(rect);
    }

    NSImageView *subview = [[NSImageView alloc] initWithFrame:CGRectMake(3, 0, 20, 20)];
    [subview setImage:[NSImage imageNamed:@"icon.png"]];
    [self addSubview:subview];


}

- (void)mouseDown:(NSEvent *)event
{

    NSRect frame = [[self window]frame];
    NSPoint pt = NSMakePoint(NSMinX(frame), NSMinY(frame));
    NSLog(@"X: %f and Y: %f", pt.x, pt.y);

    [self setNeedsDisplay:YES];
    clicked = !clicked;

    [appDelegate buttonClicked:pt.x posy:pt.y];


}

窗口可以很好地显示和隐藏,但前提是我单击StatusItem。我想添加隐藏窗口的行为,当用户单击外部或当选择菜单栏中的另一个项目时(就像典型的NSMenu应用程序一样)。

该怎么做呢?如果你有任何想法来简化我的代码(对不起,我是Mac编程的新手)-让我们说吧。

EN

回答 3

Stack Overflow用户

发布于 2012-08-19 00:31:21

注册NSWindowDidResignKeyNotificationNSWindowDidResignMainNotification,以便在窗口失去焦点时收到通知:

代码语言:javascript
运行
复制
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    SEL theSelector = @selector(closeWindow); 
    NSNotificationCenter* theCenter = [NSNotificationCenter defaultCenter]; 
    NSWindow* theWindow = [self window]; 
    [theCenter addObserver:self selector:theSelector name:NSWindowDidResignKeyNotification object:theWindow]; 
    [theCenter addObserver:self selector:theSelector name:NSWindowDidResignMainNotification object:theWindow]; 
}

现在,在窗口失去焦点的情况下执行以下操作:

代码语言:javascript
运行
复制
-(void)closeWindow
{
    [[self window] close];
}

或者使用NSPanel,它会在焦点丢失的情况下自动隐藏。

票数 4
EN

Stack Overflow用户

发布于 2017-03-22 20:08:09

代码语言:javascript
运行
复制
-(void)applicationDidResignActive:(NSNotification *)notification
{
    [self window] close];
}

试一下只有当你的应用程序处于焦点状态时才会起作用。为了让它聚焦..。也试试这个- :

NSApp激活:是;

票数 1
EN

Stack Overflow用户

发布于 2021-09-23 16:46:04

@Anne答案的Swift 5版本:

代码语言:javascript
运行
复制
NotificationCenter.default.addObserver(forName: NSWindow.didResignKeyNotification, object: nil, queue: OperationQueue.main) { _ in
    self.window?.close()
}

NotificationCenter.default.addObserver(forName: NSWindow.didResignMainNotification, object: nil, queue: OperationQueue.main) { _ in
    self.window?.close()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12019808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档