【问题标题】:How can I create mainMenu and menu items in AppDelegate for Cocoa macOS?如何在 AppDelegate for Cocoa macOS 中创建 mainMenu 和菜单项?
【发布时间】:2023-02-04 00:52:57
【问题描述】:

我正在尝试从 AppDelegate 构建我的 mainMenu,我已经断开我的 Storyboard 文件并且我正在使用 main.swift 文件加载我的应用程序作为 @main我尝试了这个代码来构建我的菜单,但它不起作用,功能不创建我的项目,我也没有错误或问题,我认为创建的菜单无法插入我的应用程序。

我的 main.swift 文件:

 import Cocoa

// 1
let app = NSApplication.shared
let delegate = AppDelegate()
app.delegate = delegate

// 2
_ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)

import Cocoa
import SwiftUI

class AppDelegate: NSObject, NSApplicationDelegate {

    private var window: NSWindow!

    func applicationDidFinishLaunching(_ aNotification: Notification) {

        window = NSWindow(
            contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
            styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
            backing: .buffered, defer: false)
        
        window.center()
        window.setFrameAutosaveName("Main Window")
        window.title = "No Storyboard Window"
        window.contentView = NSHostingView(rootView: ContentView())
        window.makeKeyAndOrderFront(nil)
        
        customMainMenu()
 
    }
    
    
    func customMainMenu() {
        
        if let appMainMenu = NSApp.mainMenu {
            
            let mainMenu = NSMenuItem()
            mainMenu.submenu = NSMenu(title: "MainMenu")

            let mainMenuItem1 = NSMenuItem(title: "Close", action: #selector(NSWindow.performClose(_:)), keyEquivalent: "w")
            mainMenuItem1.keyEquivalentModifierMask = .command

            let mainMenuItem2 = NSMenuItem(title: "Quit", action: #selector(NSApplication.shared.terminate(_:)), keyEquivalent: "q")
            mainMenuItem2.keyEquivalentModifierMask = .command
            

            mainMenu.submenu?.items = [mainMenuItem1, mainMenuItem2]
            appMainMenu.items = [mainMenu]
            
        }
    }
 
}

【问题讨论】:

标签: swift macos cocoa appdelegate


【解决方案1】:

以下源代码将为 swift 创建一个基本菜单。要在 Xcode 中运行,请创建一个 Swift 项目并删除 AppDelegate 文件的内容并将其替换为以下内容。然后将 AppDelegate.swift 文件的名称更改为 main.swift 并运行。该窗口已经可以关闭,因此我没有为此添加多余的菜单项。

import Cocoa

// **** App Delegate **** //
class AppDelegate: NSObject, NSApplicationDelegate {
 var window: NSWindow!

func buildMenu() {

 let mainMenu = NSMenu()
 NSApp.mainMenu = mainMenu
// **** App menu **** //
 let appMenuItem = NSMenuItem()
 mainMenu.addItem(appMenuItem)
 let appMenu = NSMenu()
 appMenuItem.submenu = appMenu
 appMenu.addItem(withTitle:"Quit", action:#selector(NSApplication.terminate), keyEquivalent: "q")
}
    
func buildWnd() {
    
let _wndW = CGFloat (440)
let _wndH = CGFloat (300)
// **** Window **** //
window = NSWindow(contentRect:NSMakeRect(0,0,_wndW,_wndH),styleMask:[.titled, .closable, .miniaturizable, .resizable], backing:.buffered, defer:false)
window.center()
window.title = "Swift Test Window"
window.makeKeyAndOrderFront(window)
}
 
func applicationDidFinishLaunching(_ notification: Notification) {
 buildMenu()
 buildWnd()
}

}
let appDelegate = AppDelegate()

// **** Main **** //
let application = NSApplication.shared
application.delegate = appDelegate
application.run()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多