NSViewを継承しているクラスではmenu(for:)をオーバーライドすることでコンテクストメニューを簡単に実装できます。
NSMenuを作成して、メニューを追加して、メソッドの戻り値として戻せば実装できます。
サンプルコードではNSTableViewを使っていますが、コントロールはNSControlを継承していて、NSControlはNSViewを継承しています。
NSViewを継承していれば、先ほどのmenu(for:)をオーバーライドできます。
class MyTableView: NSTableView {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
// Drawing code here.
}
//コンテクストメニュー(右クリック)の表示
override func menu(for event: NSEvent) -> NSMenu? {
//コンテクストメニューの箱です
let menu = NSMenu(title: "Context Menu")
//これは、私のアプリで処理を実装しているのがViewContorllerの為回りくどいことをしています。
let myApp = NSApplication.shared.delegate as! AppDelegate
//ここからコンテクストメニューの一覧です。
//NSLocalizedString(_:comment:)は多言語化の為のメソッドです。多言語化の雰囲気を味わってもらえればよいかなと思いそのままにしています。
menu.addItem(withTitle: NSLocalizedString("MENU_APPEND_NEW_ROW", comment: ""), action: #selector(myApp.mainView!.addRow(_:)), keyEquivalent: "")
menu.addItem(withTitle: NSLocalizedString("MENU_INSERT_NEW_ROW_BEFORE_SELECTED", comment: ""), action: #selector(myApp.mainView!.insertNewRow), keyEquivalent: "")
menu.addItem(withTitle: NSLocalizedString("MENU_COPY_ROW", comment: ""), action: #selector(myApp.mainView!.copyRow), keyEquivalent: "")
menu.addItem(withTitle: NSLocalizedString("MENU_OVERWRITE_SELECTED_ROW_PASTE", comment: ""), action: #selector(myApp.mainView!.pasteOverWrite), keyEquivalent: "")
menu.addItem(withTitle: NSLocalizedString("MENU_INSERT_COPY_ROW_BEFORE_SELECTED", comment: ""), action: #selector(myApp.mainView!.insertCopiedRow), keyEquivalent: "")
menu.addItem(withTitle: NSLocalizedString("MENU_APPEND_COPY_ROW", comment: ""), action: #selector(myApp.mainView!.pasteRow), keyEquivalent: "")
menu.addItem(withTitle: NSLocalizedString("MENU_DELETE_ROW", comment: ""), action: #selector(myApp.mainView!.deleteRow), keyEquivalent: "")
return menu
}
}
