列表右键菜单是非常常用的功能,甚至可以说是必备的功能,合理的右键菜单可以极大的提高app的效率和用户体验。

在cocoa的列表编程中,实现右键菜单有两种方法:
1,重写NSView的有方法:
- (nullable NSMenu *)menuForEvent:(NSEvent *)event;
的方法, NSTableView 是 NSView 的子类,NSOutlineView是NSTableView的子类,该方法比较复杂。
2,使用苹果给我们提供的现成的API实现,方法如下(以NSOutlineView为例):
第一步:创建NSMenu赋值给NSOutlineView,设置NSMenu代理
@IBOutlet weak var outLineView: NSOutlineView!{
didSet{
let menu = NSMenu(title: "删除订单")
menu.delegate = self
outLineView.menu = menu
}
第二步骤:实现代理
extension AgentTrip:NSMenuDelegate{
func menuNeedsUpdate(_ menu: NSMenu) {
//获取右键选中的row
let row = outLineView.clickedRow
//根据相中的row得到对应的item
let item = outLineView.item(atRow: row)
//判断对应的item的类型添动态添加不同的右键菜单
if item is Trip {
menu.removeAllItems()
menu.addItem(NSMenuItem(title: "删除此次代购", action: #selector(deleteTrip(_:)), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: "为此次代购添加订单", action: #selector(addOrder(_:)), keyEquivalent: ""))
}else{
menu.removeAllItems()
menu.addItem(NSMenuItem(title: "删除该订单", action: #selector(deleteOrder(_:)), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: "为该订单添加商品", action: #selector(addProduct(_:)), keyEquivalent: ""))
}
}
//实现菜单item的响应功能
@objc func deleteTrip(_ item:NSMenuItem){
let row = outLineView.clickedRow
if let item = outLineView.item(atRow: row) as? Trip{
Trip.removeTrip(tripName: item.name)
for (i,e) in tripArray.enumerated(){
if e.name == item.name{
tripArray.remove(at: i)
break
}
}
outLineView.removeItems(at: IndexSet(integer: row), inParent: false, withAnimation: .effectFade)
}
}
网友评论