有没有办法将mouseOver事件添加到cocoa中的tableView?

时间:2014-04-28 03:45:04

标签: objective-c macos cocoa nstableview

我想让我的tableView行为如下:
当鼠标滑过某一行时,该行将突出显示,就像按钮的mouseOver事件一样

3 个答案:

答案 0 :(得分:5)

基于this提示我花了一些时间来处理它。

它对我有用,如果我错了,请纠正我。

在macOS 10.12.2和Xcode 8.2.1上使用Swift 3.0.2进行测试

//
// Created by longkai on 30/12/2016.
// Copyright (c) 2016 xiaolongtongxue.com. All rights reserved.
//

import Cocoa

class InboxTableCellView: NSTableCellView {
    // MARK: - Outlets
    @IBOutlet weak var title: NSTextField!
    @IBOutlet weak var sender: NSTextField!
    @IBOutlet weak var time: NSTextField!
    @IBOutlet weak var snippet: NSTextField!

    // MARK: - Mouse hover
    deinit {
        removeTrackingArea(trackingArea)
    }

    private var trackingArea: NSTrackingArea!

    override func awakeFromNib() {
        super.awakeFromNib()
        self.trackingArea = NSTrackingArea(
            rect: bounds,
            options: [NSTrackingAreaOptions.activeAlways, NSTrackingAreaOptions.mouseEnteredAndExited,/* NSTrackingAreaOptions.mouseMoved */],
            owner: self,
            userInfo: nil
        )
        addTrackingArea(trackingArea)
    }

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        NSColor(red: 0.96, green: 0.96, blue: 0.96, alpha: 1.00).set()

        // mouse hover
        if highlight {
            let path = NSBezierPath(rect: bounds)
            path.fill()
        }

        // draw divider
        let rect = NSRect(x: 0, y: bounds.height - 2, width: bounds.width, height: bounds.height)
        let path = NSBezierPath(rect: rect)
        path.fill()
    }

    private var highlight = false {
        didSet {
            setNeedsDisplay(bounds)
        }
    }

    override func mouseEntered(with event: NSEvent) {
        super.mouseEntered(with: event)
        if !highlight {
            highlight = true
        }
    }

    override func mouseExited(with event: NSEvent) {
        super.mouseExited(with: event)
        if highlight {
            highlight = false
        }
    }
}

答案 1 :(得分:1)

(忽略“Mouse Over is bad GUI”讲道(无论如何你都会忽略......; - ))

#import "MoTableView.h"

@implementation MoTableView
{
    NSUInteger mouseRow;
    NSRect mouseRowFrame;
}

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
        mouseRow = -1;
    }
    return self;
}

- (void)awakeFromNib
{
    [self.window setAcceptsMouseMovedEvents:YES];
}

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];

    // Drawing code here.
    [[NSColor redColor] set];
    NSLogDebug(@"mouseRowFrame: %@", NSStringFromRect(mouseRowFrame));
    NSFrameRectWithWidth(mouseRowFrame, 2.);
}

- (void)mouseMoved:(NSEvent *)theEvent
{
    NSPoint mouseLocation = [theEvent locationInWindow];
    NSPoint viewLocation = [self convertPoint:mouseLocation fromView:nil] ;
    NSInteger row = [self rowAtPoint:viewLocation];
    if (row != mouseRow) {
        mouseRowFrame = [self rectOfRow:row];
        [self setNeedsDisplay];
        mouseRow = row;
    }
}

@end

答案 2 :(得分:1)

您需要创建子类并使用跟踪区域。这是用于跟踪鼠标悬停的按钮。

Apple示例代码可以完全满足您的需求 - 在悬停时突出显示行:

HoverTableDemo

WWDC 2011 Session 120

中对此进行了彻底的讨论