Mac开发基础练习:制作一个状态栏(NSStatusBar)上的App(二)

我们在练习(一)中完成了状态栏图标点击,弹出内容视图的效果,但是项目看起来还有些体验不是非常符合用户习惯,(例如点击应用之外的其他地方,popover 并没有自动消失)我们继续来添加和完善一些用户功能,使得应用看起来有好一点的使用体验,接下来我们为popover添加鼠标的事件监听和退出应用的功能。

为了响应系统的鼠标事件,我们需要使用Cocoa框架中的NSEvent类来为应用添加监听对象,在Mac 开发中,通常我们都是被(鼠标或键盘)事件驱动的,当OSX系统接收到一个事件后,会添加到窗口服务进程的处理队列中,然后通过服务进程异步的派发事件(事件可能会被copy)给应用程序,应用程序会通过delegate响应对应的事件。

应用程序在响应事件的过程中,会生成一个monitor(监听)对象,通常情况下我们完成监听事件后,不必对这个对象进行手动释放,系统API会在合适的时机进行release。

1.1 选中ViewController.m文件,添加鼠标左键点击事件监听,实现代码如下图:

运行应用,点击状态栏图标显示popover后,用鼠标点击应用窗口外的其他地方,这时你会发现popover会自动隐藏起来了,这样的效果与之前的相比,要更合适操作一些。除此之外,我们继续为popover 添加一个button,来实现退出应用的功能。

1.2 选中SBPopViewController.xib文件,添加button,并设置入下图:

添加button


1.3 选中SBPopViewController.m,为button添加事件响应代码如下图:

添加按钮响应代码

再次运行应用,如果没有错误,点击状态栏图标,界面大概样子应该入下图:

应用运行效果

点击退出按钮,你会发现应用将结束进程并退出。现在我们这个应用可以实现显示popover,并点击应用之外的地方可以隐藏popover,并可以手动退出应用,这些基本功能已经都完成了,但从项目开始到现在,window窗口一直都伴随每次启动显示(它在我们这个应用看起来没什么用处),针对我们只设计一个在系统状态栏的demo应用来说,window是可以不要的,那么我们来对window进行处理。

1.4 选中Main.storyboard文件,从项目中删除,并清空工程配置,入下图:

删除main.storyboard

如果这时你运行工程,会发现之前的window不显示了(因为已经删除了嘛),但是状态栏的图标也没有显示,应用运行起来,但桌面没有任何我们需要的效果,这时我们在打开活动监视器,发现应用其实是正常运转的(如下图)。

活动监视器显示demo运行正常

这是由于我们之前使用的xib文件加载window,系统为我们默认做了一些其他方面的事,比如再加载window之前,创建应用对象,设置应用代理,配置窗口设置等,那系统是在哪里做的这些事情呢?其实是在main.m文件里的调用了系统的NSApplicationMain()这个重要的函数,这个函数屏蔽了很多细节,这对新入门的来说是件好事,可以很容易的进行业务代码的工作而不必关系系统启动的细节;但如果我们需要研究系统在启动时的一些行为时,它也给我们带来了难度。

像iOS中一样,应用启动加载完成后,设置UI是从AppDelegate的这个方法-applicationDidFinishLaunching:开始的,如果我们在上面的工程中对这个方法设置调试断点,你会发现应用启动后,根本没有调用这个方法,也就是所我们删除了main.storyboard文件后,系统不再自动的为我们设置应用的delegate,需要我们自己手动在main.m中进行设置。

1.5 选中main.m文件,实现代码入下图:

main.m文件实现代码

1.6 因为我们去除了window,因此ViewController对我们来说已经没有价值了,我们只需要把之前在ViewController中写的代码,放置到AppDelegate.m中来实现就可以了,这样我们就可以删除ViewController这个类了。项目修改后的样子应该是下面这个图的的示例:

AppDelegate.m文件

如果你在这中间的步骤没有错误,那么再次运行工程,你会发现状态栏的上图标又出现了,并且我们之前实现的功能也都可以正常响应了^_^

整个工程的代码,可以从这里下载StatusBarDemoApp,好了,我们这个小练习工程介绍完了,算是为新上手Mac OSX开发的同学略微做些基础帮助,由于笔者的能力有限,如果在这个小练习工程中有错误的地方,还请各位随时回复我,或在评论里告知,这样也可以让其他人看到,共同进步。

 结束语

项目小练习只是一个学习的开始,大家可以对这个小练习再添加一些功能:比如菜单栏,比如设置开机自动启动,再或者运行后隐藏Dock上的图标,对代码结构再进行合理的组织,比如把事件监听的方法,封装为一个工具类,或者使用tableview代替SBPopViewController,添加网络请求数据等,这样就可以由这个小练习慢慢变成自己的一个小Mac 应用了,祝各位能有所收获~。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容