
[英]how to add custom NSMenuItem at menuForMenuKind in FinderSync
[英]How to add subview in NSMenuItem WITHOUT storyboard?
我知道有这样的答案,但几乎每个人的菜单栏都在 storyboard 中。我在没有使用 .xib 文件的情况下纯粹用代码实现了它,所以我不确定如何向我的 NSMenu 项目添加子视图。 我的菜单项显示如下:
func setupMenus() {
// 1
let menu = NSMenu()
let one = NSMenuItem(title: "Toggle", action: #selector(didTapOne) , keyEquivalent: "1")
menu.addItem(one)
let warning = NSMenuItem(title: "INSTRUCTIONS", action: #selector(didTapWarning) , keyEquivalent: "")
menu.addItem(warning)
menu.addItem(NSMenuItem.separator())
menu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
}
在applicationDidFinishLaunching
中定义如下:
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
NSApp.hide(nil)
if let button = statusItem.button {
button.image = NSImage(systemSymbolName: "lock.shield", accessibilityDescription: "1")
}
我不确定如何为此添加子视图。 我只想添加一行文本(显示为灰色:因为它们是说明)和一个自定义按钮,这两者看起来都可以通过子视图实现,但我不确定如何实现。 请记住,我没有使用 storyboard,因为我正在构建菜单栏应用程序。
以下 swift 代码将在您的 statusBarMenu 中创建一个子菜单,并插入一个使用 NSTextField 和功能性 NSButton 创建的复合视图。 通过创建一个 swift 项目,然后删除 AppDelegate 中所有预先提供的代码并复制/粘贴下面的代码,代码可以在 Xcode 中运行。 AppDelegate.swift 应该重命名为 main.swift 以避免错误。
import Cocoa
class MenuHandler: NSObject {
@objc func beep() {
NSSound.beep()
}
@objc func info() {
NSSound.beep()
}
}
let app = NSApplication.shared
let statusItem = NSStatusBar.system.statusItem(withLength:-1)
statusItem.button!.title = "foobar"
let menu = NSMenu()
let menuHandler = MenuHandler()
let one = NSMenuItem(title: "Toggle", action: #selector(menuHandler.beep) , keyEquivalent: "1")
one.target = menuHandler
menu.addItem(one)
let warning = NSMenuItem(title: "INSTRUCTIONS", action: #selector(menuHandler.beep) , keyEquivalent: "")
warning.target = menuHandler
menu.addItem(warning)
let subMenu = NSMenu()
let info = NSMenuItem()
let infoView = NSView(frame:NSMakeRect(0, 0, 180, 24 ))
let txtFld = NSTextField(frame:NSMakeRect(10, 0, 130, 20 ))
txtFld.backgroundColor = NSColor.clear
txtFld.isEditable = false
txtFld.isBordered = false
txtFld.stringValue = "Bunch of information"
let btn = NSButton(frame:NSMakeRect(140, 0, 24, 24 ))
btn.image = NSImage(named:"myImage.png")
btn.imageScaling = .scaleProportionallyDown
btn.imagePosition = .imageOnly
btn.target = menuHandler
btn.action = #selector(menuHandler.info)
infoView.addSubview(txtFld)
infoView.addSubview(btn)
info.view = infoView
subMenu.addItem(info)
menu.setSubmenu(subMenu, for: warning)
menu.addItem(NSMenuItem.separator())
menu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
statusItem.menu = menu
app.run()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.