检查是否在NSTableView中单击了鼠标

时间:2015-06-18 09:28:43

标签: macos swift cocoa nstableview nsevent

我在NSTableView子类中有一些鼠标点击检查代码,可以拦截和修改鼠标事件以允许点击表格内的按钮,但问题是如果点击鼠标也会拦截这些事件在其他任何地方,而不仅仅是在桌子上。因此,我的问题是:如何检查NSPoint.locationInWindow是否仅在表格的可见范围内?

下面的代码允许事件通过,即使在表格行滚动到可见表区域之外的地方点击。

class ButtonTableView : NSTableView
{
    var isAtForeground:Bool = false;

    override init(frame frameRect:NSRect) {
        super.init(frame: frameRect);
    }

    required init?(coder:NSCoder) {
        super.init(coder: coder);
        addEventInterception();
    }

    func addEventInterception() {
        NSEvent.addLocalMonitorForEventsMatchingMask(.LeftMouseDownMask, handler: {
            (theEvent) -> NSEvent! in

            /* Don't bother if the table view is not in the foreground! */
            if (!self.isAtForeground) { return theEvent; }

            var e:NSEvent? = theEvent;
            let p:NSPoint = theEvent.locationInWindow;

            // Check for click within table bounds
            let tableBoundsInWindowCoords:NSRect = self.convertRect(self.bounds, toView: nil);
            if (CGRectContainsPoint(tableBoundsInWindowCoords, p))
            {
                // This gets through even if clicked on table rows that are scrolled-out and not within the table's visible area!
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

等待!没说什么!经过深思熟虑之后,我再次弄明白了......我不应该检查表格视图的界限,而不是它的超级视图NSClipView!完全有道理,但可能不会立即明显。这解决了这个问题。