前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >macOS NSTableView鼠标右键菜单

macOS NSTableView鼠标右键菜单

作者头像
大话swift
发布2019-07-03 15:51:08
2.1K0
发布2019-07-03 15:51:08
举报
文章被收录于专栏:大话swift大话swift

macOS开发中对于鼠标的支持没有Windows那种的鼠标悬停功能,需要自己手动去实现。幸运的是可以检测鼠标在NSView的滑入和退出等事件,我们可以通过这种方式来实现鼠标的监听,开确认是否显示菜单,然后转换为对应的位置,再根据位置后去搜找对应cell,之后添加菜单显示操作即可实现啦?

定义一个protocol

```

@objc protocol ContextMenu {

@objc func tableView(_ tableView: NSTableView, menuForRows rows:IndexSet)->NSMenu?

@objc func tableView(_ tableView: NSTableView, clickForRow row: Int) -> Void

}

```

extension tableview重写鼠标事件

```

extension NSTableView {

open override func menu(for event: NSEvent) -> NSMenu? {

let location = self.convert(event.locationInWindow, from: nil)

let row = self.row(at: location)

if row >= 0 && event.type == .rightMouseDown {

var selected = self.selectedRowIndexes

if false == selected.contains(row) {

selected = IndexSet.init(integer: row)

self.selectRowIndexes(selected, byExtendingSelection: false)

}

if let dele:ContextMenu = (self.delegate as? ContextMenu) {

return dele.tableView(self, menuForRows: selected)

}else{

return super.menu(for: event)

}

}

return super.menu(for: event)

}

open override func mouseDown(with event: NSEvent) {

let location = self.convert(event.locationInWindow, from: nil)

let row = self.row(at: location)

if row >= 0 && event.type == .rightMouseDown {

var selected = self.selectedRowIndexes

if false == selected.contains(row) {

selected = IndexSet.init(integer: row)

self.selectRowIndexes(selected, byExtendingSelection: false)

}

if let dele:ContextMenu = (self.delegate as? ContextMenu) {

dele.tableView(self, clickForRow: row)

}

}

return super.mouseDown(with: event)

}

open override func mouseEntered(with event: NSEvent) {

var btInfo:BTInfo = BTInfo()

}

open override func mouseExited(with event: NSEvent) {

}

}

```

使用

```

extension BTViewController: ContextMenu{

@objc func tableView(_ tableView: NSTableView, menuForRows rows:IndexSet)->NSMenu?{

let bt: BT = self.bts![self.btTableView.selectedRow]

return self.menus(forTables: tableView, item: bt)

}

@objc func tableView(_ tableView: NSTableView, clickForRow row: Int) -> Void {

}

}

```

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档