Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >按住NSWindow键并单击外部以隐藏窗口

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

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

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

我的AppDelegate看起来像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (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
代码运行次数:0
运行
AI代码解释
复制
- (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-18 16:31:21

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (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
代码运行次数:0
运行
AI代码解释
复制
-(void)closeWindow
{
    [[self window] close];
}

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

票数 4
EN

Stack Overflow用户

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

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

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

NSApp激活:是;

票数 1
EN

Stack Overflow用户

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

@Anne答案的Swift 5版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

复制
相关文章
清理垃圾bat代码
rd /s /q %windir%\temp & md %windir%\temp
全栈程序员站长
2022/07/04
1K0
清理垃圾bat代码
/tmp目录清理问题
2019年7月10日 ⋅ 浏览量: 4   
以谁为师
2019/07/11
3.2K0
解决spark日志清理问题
由于采用了sparkstreaming 任务一直再运行导致日志文件暴涨,达到了硬盘的预警,不得已必须指定策略定期删除日志已保证服务器硬盘空间。
用户1217611
2020/11/24
2.2K0
关于清理webgame缓存的问题
直接请求百度首页http://www.baidu.com/,看到所请求的资源都是Cache
meteoric
2018/11/16
2.2K0
【Rust 基础篇】Drop Trait 清理代码
在 Rust 中,Drop trait 是一种特殊的 trait,用于定义在值离开作用域时进行清理操作的行为。通过实现 Drop trait,我们可以自定义类型在销毁时的清理逻辑,例如释放资源或执行必要的操作。
繁依Fanyi
2023/10/12
2100
解决svn清理失败,路径显示乱码问题
点击下载   SQLite是一款轻型的数据库,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
程序员云帆哥
2022/05/12
2.2K0
解决svn清理失败,路径显示乱码问题
利用正则批量清理Teleport Ultra/Pro冗余代码
Teleport 是一款非常优秀的网站离线浏览工具(即网站整站下载工具),但该软件下载的网页文件里会包含大量冗余代码(如:tppabs),手动去修改工作量很大。
德顺
2019/11/13
9830
只需一串代码,实现清理电脑缓存
任何电脑使用时间过久都会留下垃圾痕迹,及时清理系统垃圾 bat才能确保电脑的顺畅。下面就介绍一下一键清理系统垃圾bat的方法,方便快捷。
小何.
2023/03/03
2.4K0
只需一串代码,实现清理电脑缓存
[PHP] 存储改造中的逻辑和清理遗留的问题
现象:用户读信时,根据路径的哈希结果,访问四台服务器中一台请求文件,这四台缓存机器已经下线,访问不到再去后端存储访问浪费了时间
唯一Chat
2019/09/29
5840
CMI | 关于生物清理以及垃圾清理
关于生物清理 在CMI中有个定时任务的配置文件(schedules.yml) killall: Enabled: true Repeat: true Delay: 3600 Commands: - * - * 我们可在其中添加特殊命令 - actionbar! 将在30秒后清理生物 - delay 10 - actionbar! 将在20&#x
BreezeCloud
2022/10/04
1.4K0
清理Xcode
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53992611
用户1451823
2018/09/13
1.1K0
清理Xcode
Linux清理磁盘(定位高占用-->清理)
定位 df -ah可以通过 User% 那一列哪看到个占用多。 进入根目录,查询大文件与目录 cd / du -sh * | sort -n # 查看大小1GB以上的目录并且排序 du -h --max-depth=1 |grep 'G' |sort 迭代执行以上操作,定位到可以删除的大文件,将其删除即可。
bboy枫亭
2021/12/07
3.7K0
问题解决:Ubuntu 磁盘空间占满如何清理
磁盘空间占满了,有两种解决办法:开源节流。这里我讲节流。 一个命令(从根目录开始): du -h --max-depth=1 该命令用于罗列当前目录下一级以内东西大小,转换成普通人能看的。 递归。 找到病灶之后,如果不敢删,百度一下。一般如果是日志啥的但删无妨。 我找到是在 var 下面的 docker,于是百度了一下解决方法: docker system prune -a 使用的时候建议将要保留的镜像打开,不然会全给你清理了。它有给英文提示。
看、未来
2022/05/06
1.2K0
Windows更新清理工具 (winsxs 清理工具)
Windows 更新清理工具是一款效果非常显著的Windows7、Windows8操作系统清理优化工具!经常安装系统的朋友相比有所体会,刚刚安装完成的Win7、Win8其实占的空间并不大,去掉页面文件和休眠文件后,真正的系统只几个G而已,但如果你给系统升级了补丁后,你会发现系统所需要占用的空间直线上升!轻松突破10G的门槛!加上休眠文件和页面文件,本来预留给系统的30G空间马上变得也不富裕了。 究其原因,在于系统目录下的WinSxS目录占用了大量的空间!在我们安装了大量的系统更新后,新的系统文件会替代旧
张善友
2018/01/19
11.8K1
Windows更新清理工具 (winsxs 清理工具)
代码乱码问题
vs studio默认编码使用unicode,qt creator编辑器代码在vs中不识别错误
sofu456
2023/07/10
1330
代码乱码问题
10行Python代码自动清理电脑内重复文件,解放双手!
「给定一个文件夹,使用Python检查给定文件夹下有无文件重复,若存在重复则删除」
Python进阶者
2020/09/30
1K0
10行Python代码自动清理电脑内重复文件,解放双手!
「给定一个文件夹,使用Python检查给定文件夹下有无文件重复,若存在重复则删除」
刘早起
2020/08/20
1.4K0
Windows 10 电脑垃圾清理教程,缓存垃圾清理
Windows 10是目前广泛使用的操作系统之一。由于长时间运行Windows 10电脑,会积累大量临时文件、日志和其他不需要的文件,导致系统变慢并占用磁盘空间。
用户8551789
2023/04/10
3.8K0
Windows 10 电脑垃圾清理教程,缓存垃圾清理
下一个问题,你合理清理内存了吗?
大家好,我是光城,没想到昨日问题留言竟然这么多人,那么这个系列,我也将继续持续下去,今天先来给大家答案,接下来给出一个新问题。
公众号guangcity
2022/04/27
2120
10行Python代码自动清理电脑内重复文件,解放双手!
「给定一个文件夹,使用Python检查给定文件夹下有无文件重复,若存在重复则删除」
小小詹同学
2020/09/08
5080
10行Python代码自动清理电脑内重复文件,解放双手!

相似问题

查找Roslyn默认的可空上下文

25

JBehave空上下文

10

setUserVisibleHint中的空上下文

216

隐藏空上下文菜单

10

异步上下文管理器

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文