一、匆匆一閱
內(nèi)核接收到外設(shè)的觸發(fā)事件后瞄崇,將事件打包成一個數(shù)據(jù)包(Event)傳輸給Window Server刚操。Window Server通過應(yīng)用端口(run-loop port)將事件放入應(yīng)用的事件容器(Event Source)中蜀细。應(yīng)用在主循環(huán)(Main Loop)處理收到的事件谤逼。
二、正文
第一步:事件如何進入應(yīng)用(How an Event Enters a Cocoa Application)
在NSApplication初始化的時候(即調(diào)用[NSApplication sharedApplication];)仇穗,會生成一個
事件容器(Event Source)流部,用來從各種輸入來源接收事件(Event)。處理事件的順序是 先進先出形勢(FIFO)纹坐。
第二步:應(yīng)用內(nèi)部的事件分發(fā)(Event Dispatch)
1枝冀、在應(yīng)用的主循環(huán)(Main Loop)中,每一次循環(huán)都會從事件容器(Event Source)中獲取一個事件耘子,然后處理果漾。假如沒有事件則不處理,繼續(xù)下一個循環(huán)谷誓。
通過調(diào)用如下方法獲取下一個事件(Event)
nextEventMatchingMask:untilData:inMode:dequeue
方法具體情況如下:
(nullable NSEvent *)nextEventMatchingMask:(NSEventMask)mask untilDate:(nullable NSDate *)expiration inMode:(NSRunLoopMode)mode dequeue:(BOOL)deqFlag;
2绒障、大多數(shù)情況下獲取到一個事件(Event)后,我們應(yīng)該把事件轉(zhuǎn)交給應(yīng)用(NSApplication)處理捍歪,當(dāng)然你也可以交給你自己喜歡的東西去處理獲取到的事件户辱。
通過調(diào)用如下方法把事件(Event)轉(zhuǎn)發(fā)給應(yīng)用處理(NSApplication)
sendEvent:event
方法具體情況如下:
(void)sendEvent:(NSEvent *)event;
3、大多數(shù)情況下應(yīng)用(NSApplication)只是將得到的Event分發(fā)給窗口(NSWindow)糙臼。然后窗口(NSWindow)會將部分的事件轉(zhuǎn)發(fā)給視圖(NSView)庐镐,例如:mouseDown、keyDown变逃。
三必逆、傳送門
閱讀導(dǎo)向
筆者相關(guān)文檔:
Cocoa 鼠標(biāo)、觸摸板事件
[Cocoa 鍵盤事件 Keyboard Events