我們?cè)诰毩?xí)(一)中完成了狀態(tài)欄圖標(biāo)點(diǎn)擊掌逛,彈出內(nèi)容視圖的效果错妖,但是項(xiàng)目看起來還有些體驗(yàn)不是非常符合用戶習(xí)慣给僵,(例如點(diǎn)擊應(yīng)用之外的其他地方,popover 并沒有自動(dòng)消失)我們繼續(xù)來添加和完善一些用戶功能,使得應(yīng)用看起來有好一點(diǎn)的使用體驗(yàn)尝丐,接下來我們?yōu)閜opover添加鼠標(biāo)的事件監(jiān)聽和退出應(yīng)用的功能绰筛。
為了響應(yīng)系統(tǒng)的鼠標(biāo)事件娇澎,我們需要使用Cocoa框架中的NSEvent類來為應(yīng)用添加監(jiān)聽對(duì)象疲恢,在Mac 開發(fā)中凶朗,通常我們都是被(鼠標(biāo)或鍵盤)事件驅(qū)動(dòng)的,當(dāng)OSX系統(tǒng)接收到一個(gè)事件后显拳,會(huì)添加到窗口服務(wù)進(jìn)程的處理隊(duì)列中棚愤,然后通過服務(wù)進(jìn)程異步的派發(fā)事件(事件可能會(huì)被copy)給應(yīng)用程序,應(yīng)用程序會(huì)通過delegate響應(yīng)對(duì)應(yīng)的事件杂数。
應(yīng)用程序在響應(yīng)事件的過程中宛畦,會(huì)生成一個(gè)monitor(監(jiān)聽)對(duì)象,通常情況下我們完成監(jiān)聽事件后耍休,不必對(duì)這個(gè)對(duì)象進(jìn)行手動(dòng)釋放刃永,系統(tǒng)API會(huì)在合適的時(shí)機(jī)進(jìn)行release。
1.1 選中ViewController.m文件羊精,添加鼠標(biāo)左鍵點(diǎn)擊事件監(jiān)聽斯够,實(shí)現(xiàn)代碼如下圖:
運(yùn)行應(yīng)用,點(diǎn)擊狀態(tài)欄圖標(biāo)顯示popover后喧锦,用鼠標(biāo)點(diǎn)擊應(yīng)用窗口外的其他地方读规,這時(shí)你會(huì)發(fā)現(xiàn)popover會(huì)自動(dòng)隱藏起來了,這樣的效果與之前的相比燃少,要更合適操作一些束亏。除此之外,我們繼續(xù)為popover 添加一個(gè)button阵具,來實(shí)現(xiàn)退出應(yīng)用的功能碍遍。
1.2 選中SBPopViewController.xib文件,添加button阳液,并設(shè)置入下圖:
1.3 選中SBPopViewController.m,為button添加事件響應(yīng)代碼如下圖:
再次運(yùn)行應(yīng)用怕敬,如果沒有錯(cuò)誤,點(diǎn)擊狀態(tài)欄圖標(biāo)帘皿,界面大概樣子應(yīng)該入下圖:
點(diǎn)擊退出按鈕东跪,你會(huì)發(fā)現(xiàn)應(yīng)用將結(jié)束進(jìn)程并退出。現(xiàn)在我們這個(gè)應(yīng)用可以實(shí)現(xiàn)顯示popover鹰溜,并點(diǎn)擊應(yīng)用之外的地方可以隱藏popover虽填,并可以手動(dòng)退出應(yīng)用,這些基本功能已經(jīng)都完成了曹动,但從項(xiàng)目開始到現(xiàn)在斋日,window窗口一直都伴隨每次啟動(dòng)顯示(它在我們這個(gè)應(yīng)用看起來沒什么用處),針對(duì)我們只設(shè)計(jì)一個(gè)在系統(tǒng)狀態(tài)欄的demo應(yīng)用來說墓陈,window是可以不要的桑驱,那么我們來對(duì)window進(jìn)行處理竭恬。
1.4 選中Main.storyboard文件,從項(xiàng)目中刪除熬的,并清空工程配置痊硕,入下圖:
如果這時(shí)你運(yùn)行工程,會(huì)發(fā)現(xiàn)之前的window不顯示了(因?yàn)橐呀?jīng)刪除了嘛)押框,但是狀態(tài)欄的圖標(biāo)也沒有顯示岔绸,應(yīng)用運(yùn)行起來,但桌面沒有任何我們需要的效果橡伞,這時(shí)我們?cè)诖蜷_活動(dòng)監(jiān)視器盒揉,發(fā)現(xiàn)應(yīng)用其實(shí)是正常運(yùn)轉(zhuǎn)的(如下圖)。
這是由于我們之前使用的xib文件加載window兑徘,系統(tǒng)為我們默認(rèn)做了一些其他方面的事刚盈,比如再加載window之前,創(chuàng)建應(yīng)用對(duì)象挂脑,設(shè)置應(yīng)用代理藕漱,配置窗口設(shè)置等,那系統(tǒng)是在哪里做的這些事情呢崭闲?其實(shí)是在main.m文件里的調(diào)用了系統(tǒng)的NSApplicationMain()這個(gè)重要的函數(shù)肋联,這個(gè)函數(shù)屏蔽了很多細(xì)節(jié),這對(duì)新入門的來說是件好事刁俭,可以很容易的進(jìn)行業(yè)務(wù)代碼的工作而不必關(guān)系系統(tǒng)啟動(dòng)的細(xì)節(jié)橄仍;但如果我們需要研究系統(tǒng)在啟動(dòng)時(shí)的一些行為時(shí),它也給我們帶來了難度牍戚。
像iOS中一樣侮繁,應(yīng)用啟動(dòng)加載完成后,設(shè)置UI是從AppDelegate的這個(gè)方法-applicationDidFinishLaunching:開始的如孝,如果我們?cè)谏厦娴墓こ讨袑?duì)這個(gè)方法設(shè)置調(diào)試斷點(diǎn)宪哩,你會(huì)發(fā)現(xiàn)應(yīng)用啟動(dòng)后,根本沒有調(diào)用這個(gè)方法暑竟,也就是所我們刪除了main.storyboard文件后,系統(tǒng)不再自動(dòng)的為我們?cè)O(shè)置應(yīng)用的delegate育勺,需要我們自己手動(dòng)在main.m中進(jìn)行設(shè)置但荤。
1.5 選中main.m文件,實(shí)現(xiàn)代碼入下圖:
1.6 因?yàn)槲覀內(nèi)コ藈indow涧至,因此ViewController對(duì)我們來說已經(jīng)沒有價(jià)值了腹躁,我們只需要把之前在ViewController中寫的代碼,放置到AppDelegate.m中來實(shí)現(xiàn)就可以了南蓬,這樣我們就可以刪除ViewController這個(gè)類了纺非。項(xiàng)目修改后的樣子應(yīng)該是下面這個(gè)圖的的示例:
如果你在這中間的步驟沒有錯(cuò)誤哑了,那么再次運(yùn)行工程,你會(huì)發(fā)現(xiàn)狀態(tài)欄的上圖標(biāo)又出現(xiàn)了烧颖,并且我們之前實(shí)現(xiàn)的功能也都可以正常響應(yīng)了^_^
整個(gè)工程的代碼弱左,可以從這里下載StatusBarDemoApp,好了炕淮,我們這個(gè)小練習(xí)工程介紹完了拆火,算是為新上手Mac OSX開發(fā)的同學(xué)略微做些基礎(chǔ)幫助,由于筆者的能力有限涂圆,如果在這個(gè)小練習(xí)工程中有錯(cuò)誤的地方们镜,還請(qǐng)各位隨時(shí)回復(fù)我,或在評(píng)論里告知润歉,這樣也可以讓其他人看到模狭,共同進(jìn)步。
?結(jié)束語
項(xiàng)目小練習(xí)只是一個(gè)學(xué)習(xí)的開始踩衩,大家可以對(duì)這個(gè)小練習(xí)再添加一些功能:比如菜單欄嚼鹉,比如設(shè)置開機(jī)自動(dòng)啟動(dòng),再或者運(yùn)行后隱藏Dock上的圖標(biāo)九妈,對(duì)代碼結(jié)構(gòu)再進(jìn)行合理的組織反砌,比如把事件監(jiān)聽的方法,封裝為一個(gè)工具類萌朱,或者使用tableview代替SBPopViewController,添加網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)等宴树,這樣就可以由這個(gè)小練習(xí)慢慢變成自己的一個(gè)小Mac 應(yīng)用了,祝各位能有所收獲~晶疼。