mac開發(fā)系列17:定制NSView的事件處理

這里以鼠標左擊,即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]; // 事件處理
}];

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容