這里以鼠標左擊,即mouseDown為例。
我們通常的做法是,實現一個NSView的子類,例如mac微信中的MMView,然后在子類中重寫mouseDown函數,再在mouseDown函數里面實現自己的事件處理邏輯。
不過,有些場景需要我們在此基礎上做更加靈活的定制:MMView實際上是作為公共UI控件(一般會是NSWindow或者NSView的屬性/成員變量),不同NSWindow/NSView中的事件處理邏輯是不一樣的,而且這樣的NSWindow/NSView會隨著業(yè)務需要不斷增加。這就意味著,不可能在MMView的mouseDown中窮舉所有的事件處理邏輯(即使可以,也不應該在公共控件中耦合過多的業(yè)務邏輯)。
我們可以讓mouseDown只負責事件捕捉以及事件傳遞(通過block來傳遞),事件處理交給具體的NSWindow/NSView來實現,代碼實現如下:
1、在MMView中定義:
@property (nonatomic, copy) void (^mouseDownInsideBlock)(NSEvent *theEvent); // 這個block用于接受mouseDown傳遞過來的event
(void)setMouseDownInsideBlock:(void (^)(NSEvent *))mouseDownInsideBlock; // block的set函數
2、MMView中的mouseDown函數捕捉事件,并通過block傳遞:-
(void)mouseDown:(NSEvent *)theEvent {
if (self.mouseDownInsideBlock) {
NSPoint aPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
if (!NSPointInRect(aPoint, self.bounds)) {
return;
}
// Call back
self.mouseDownInsideBlock(theEvent); // 事件傳遞} else {
[super mouseDown:theEvent];
}
}
3、NSWindow/NSView中接受mouseDown傳遞過來的事件,并做所需的事件處理:
@weakify(self)
[self.sendToFriendContainer setMouseDownInsideBlock:^(NSEvent *theEvent) {
@strongify(self)
[self onClickSendToFriend]; // 事件處理
}];