繁体   English   中英

如何在没有 storyboard 的情况下在 NSMenuItem 中添加子视图?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM