如何在SwiftUI中禁用显示选项卡栏菜单选项

tct7dpnv  于 2023-11-16  发布在  Swift
关注(0)|答案(5)|浏览(149)

我在MacOS上用SwiftUI创建了一个非常简单的应用程序。默认情况下有一个菜单项show tab bar。我如何删除它?我没有意义在这个应用程序中有标签。
我发现下面的代码回答了同样的问题,但适用于旧版本的Swift,而不是SwiftUI:How do I disable the Show Tab Bar menu option in Sierra apps?

wtlkbnrh

wtlkbnrh1#

感谢@JuJoDi
如果您使用SwiftUI生命周期(Scene),您可以执行以下操作:

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onAppear {
                    NSWindow.allowsAutomaticWindowTabbing = false
                }
        }
    }
}

字符串

afdcj2ne

afdcj2ne2#

SwiftUI中的等价物与Swift中的等价物是一样的(由于某种原因,在那篇文章中没有提到)。要从应用程序的任何窗口中完全删除这些项目,可以在应用程序委托中将布尔值allowsAutomaticWindowTabbing设置为false

func applicationWillFinishLaunching(_ notification: Notification) {
        NSWindow.allowsAutomaticWindowTabbing = false
}

字符串

kgsdhlau

kgsdhlau3#

我也在寻找这个问题的答案,并发现了以下几点:
默认情况下-正如你已经提到的-显示/隐藏选项卡是活动的:
x1c 0d1x的数据
NSWindow上有一个名为tabbingMode的属性,它允许我们通过将其设置为.disallowed来控制。但我的问题是:在SwiftUI 2生命周期应用中,我如何才能获得应用的窗口?
好吧,有NSApplication.shared.windows,所以我的第一次(不工作!!)尝试是修改我的@main-App结构中的所有窗口(因为我已经阻止了新窗口的创建,这应该足够了):

import SwiftUI

@main
struct DQ_SyslogApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onAppear {
                    let _ = NSApplication.shared.windows.map { $0.tabbingMode = .disallowed }
                }
        }
        .commands {
            CommandGroup(replacing: .newItem) {} //remove "New Item"-menu entry
        }
    }
}

字符串
不幸的是,这不起作用,因为.onAppear中的NSApplication.shared.windows是空的。
我的下一步是在我的SwiftUI 2生命周期中引入一个AppDelegate,它实现了applicationDidFinishLaunching(_:)...

class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(_ notification: Notification) {
        print("Info from `applicationDidFinishLaunching(_:): Finished launching…")
        let _ = NSApplication.shared.windows.map { $0.tabbingMode = .disallowed }
    }
}


.并将此AppDelegate引入应用程序:

import SwiftUI

@main
struct DQ_SyslogApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .commands {
            CommandGroup(replacing: .newItem) {} //remove "New Item"-menu entry
        }
    }
}


这对我来说是一个诡计:



虽然我更希望完全删除菜单项,但这至少可以防止用户拥有OP所要求的选项卡。
如果任何人碰巧知道一个解决方案来隐藏这些条目,请让我们知道。我找不到一个CommandGroupPlacement,代表这些菜单.

y1aodyip

y1aodyip4#

在阅读本文后,我发现了如何删除“编辑”菜单项
https://steipete.com/posts/top-level-menu-visibility-in-swiftui/

func applicationDidFinishLaunching(_ notification: Notification) {
    NSWindow.allowsAutomaticWindowTabbing = false

    if let mainMenu = NSApp .mainMenu {
        DispatchQueue.main.async {
            if let edit = mainMenu.items.first(where: { $0.title == "Edit"}) {
                mainMenu.removeItem(edit);
            }
        }
    }

}

字符串

nvbavucw

nvbavucw5#

2023,swiftUI 2及更高版本

导致发布构建:
x1c 0d1x的数据
看看有评论的地方“这里”:

@main
struct MyFirstApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    init() {
        // HERE
        disallowTabbingMode()
    }
    
    @SceneBuilder
    var body: some Scene {
        WindowGroup {
            AppMainView()
        }
        .commands {
            //MenuLine_MyFirstApp_CustomAbout()

            // HERE
            MenuLine_File_NewWindow_Disable()
            
            //MenuLine_Help_SupportEmail()
        }
    }
}

字符串
以及SwiftUI中理解菜单的方法+奖金

// Set Custom About window instead of default
fileprivate func MenuLine_MyFirstApp_CustomAbout() -> CommandGroup<Button<Text>> {
    CommandGroup(replacing: CommandGroupPlacement.appInfo) {
        Button("About") { appDelegate.showAboutWnd() }
    }
}

//Add some menu button into Help menu
fileprivate func MenuLine_Help_SupportEmail() -> CommandGroup<Button<Text>> {
    CommandGroup(after: CommandGroupPlacement.help) {
        Button("Support Email") { NSWorkspace.shared.open("mailto:[email protected]") }
    }
}

// Disable "File -> New window" menu item (make it absent in release build)
fileprivate func MenuLine_File_NewWindow_Disable() -> CommandGroup<EmptyView> {
    CommandGroup(replacing: .newItem) { }
}

fileprivate func disallowTabbingMode() {
    NSWindow.allowsAutomaticWindowTabbing = false
}


对于那些无法通过上述方式删除的项目,您需要使用类似的东西:
(BUT!重要的是要明白,这种方式只适用于英语本地化)

extension AppDelegate {
    func applicationWillUpdate(_ notification: Notification) {
        DispatchQueue.main.async {
            guard let currentMainMenu = NSApplication.shared.mainMenu else { return }
            
            //Need to remove by index because of no ability to delete by name - localizations issue?
            
            ["Edit", "File", "Window"].forEach { name in
                currentMainMenu.item(withTitle: name).map { NSApp.mainMenu?.removeItem($0) }
            }
            
            guard let menu = currentMainMenu.item(withTitle: "View")?.submenu else { return }
            
            menu.removeAllItems()
            
            menu.addItem(self.recentsPlusFavorites)
            menu.addItem(self.recentsMini)
            menu.addItem(self.recentsLarger)
        }
    }
}

相关问题