Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
397 views
in Technique[技术] by (71.8m points)

macos - check whether mouse was clicked inside NSTableView

I have some mouse click-checking code in a NSTableView subclass that can intercept and modify mouse events to allow for clicking of buttons inside the table but the problem is that these events are also intercepted if the mouse is clicked anywhere else, not just on the table. My question therefore: How can I check if NSPoint.locationInWindow is within ONLY the table's visible bounds?

My code below lets the event through even if clicked somewhere where a table row is scrolled beyond the visible table area.

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!
            }
        });
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Wait! Say nothing! I once again figured it out after thorough contemplation ... I shouldn't check bounds of the table view but of its superview, the NSClipView! Makes total sense but might not be instantly obvious. This fixed the issue.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

56.9k users

...