Mac開發(fā)基礎(chǔ)練習(xí):制作一個(gè)狀態(tài)欄(NSStatusBar)上的App(二)

我們?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è)置入下圖:

添加button


1.3 選中SBPopViewController.m,為button添加事件響應(yīng)代碼如下圖:

添加按鈕響應(yīng)代碼

再次運(yùn)行應(yīng)用怕敬,如果沒有錯(cuò)誤,點(diǎn)擊狀態(tài)欄圖標(biāo)帘皿,界面大概樣子應(yīng)該入下圖:

應(yīng)用運(yùn)行效果

點(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)目中刪除熬的,并清空工程配置痊硕,入下圖:

刪除main.storyboard

如果這時(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)的(如下圖)。

活動(dòng)監(jiān)視器顯示demo運(yù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)代碼入下圖:

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è)圖的的示例:

AppDelegate.m文件

如果你在這中間的步驟沒有錯(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)用了,祝各位能有所收獲~晶疼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酒贬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子翠霍,更是在濱河造成了極大的恐慌锭吨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寒匙,死亡現(xiàn)場(chǎng)離奇詭異零如,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锄弱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門考蕾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人会宪,你說我怎么就攤上這事肖卧。” “怎么了掸鹅?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵塞帐,是天一觀的道長(zhǎng)拦赠。 經(jīng)常有香客問我,道長(zhǎng)葵姥,這世上最難降的妖魔是什么荷鼠? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮牌里,結(jié)果婚禮上颊咬,老公的妹妹穿的比我還像新娘。我一直安慰自己牡辽,他們只是感情好喳篇,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著态辛,像睡著了一般麸澜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奏黑,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天炊邦,我揣著相機(jī)與錄音,去河邊找鬼熟史。 笑死馁害,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹂匹。 我是一名探鬼主播碘菜,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼限寞!你這毒婦竟也來了忍啸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤履植,失蹤者是張志新(化名)和其女友劉穎计雌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玫霎,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凿滤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庶近。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翁脆。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拦盹,靈堂內(nèi)的尸體忽然破棺而出鹃祖,到底是詐尸還是另有隱情溪椎,我是刑警寧澤普舆,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布恬口,位于F島的核電站,受9級(jí)特大地震影響沼侣,放射性物質(zhì)發(fā)生泄漏祖能。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一蛾洛、第九天 我趴在偏房一處隱蔽的房頂上張望养铸。 院中可真熱鬧,春花似錦轧膘、人聲如沸钞螟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞滨。三九已至,卻和暖如春蟆淀,著一層夾襖步出監(jiān)牢的瞬間拯啦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工熔任, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褒链,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓疑苔,卻偏偏與公主長(zhǎng)得像甫匹,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夯巷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容