如何使用SwiftUI将工具栏添加到macOS应用程序?


9

我正在尝试使用SwiftUI将标题栏中的工具栏添加到macOS应用程序,类似于下面所示。

macOS应用程序标题栏中的工具栏

我无法找到一种使用SwiftUI实现此目的的方法。目前,我的视图中有工具栏(仅具有文本字段),但我想将其移到标题栏中。

我当前的代码:

struct TestView: View {
    var body: some View {
        VStack {
            TextField("Placeholder", text: .constant("")).padding()
            Spacer()
        }
    }
}

因此,就我而言,我需要在工具栏内添加文本字段。


我在谈论macOS目标中的SwiftUI。
Bijoy Thangaraj

否,macOS SwiftUI中没有navigationBarTitle修饰符。
Bijoy Thangaraj

SwiftUI目前不支持工具栏。如果您真的需要一个(为什么?),然后使用AppKit中的一个,它仍然存在...真的。
阿斯佩里

@Asperi我能够做到这一点-请参阅下面的答案。工具栏(或标题栏附件)仍在macOS应用中广泛使用,不是吗?
Bijoy Thangaraj

@Asperi要使用AppKit中的那个,您是说对NSToolbar使用NSViewRepresentable吗?如果是这样,我尝试了该方法,但没有成功。如果您以这种方式有解决方案,我很乐意检查一下。
Bijoy Thangaraj

Answers:


4

方法1:

这是通过添加标题栏附件来完成的。我可以通过修改AppDelegate.swift文件来完成此操作。我必须应用一些奇怪的填充以使其看起来正确。

AppDelegate.swift

func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Create the SwiftUI view that provides the window contents.
        let contentView = ContentView()

        // Create the titlebar accessory
        let titlebarAccessoryView = TitlebarAccessory().padding([.top, .leading, .trailing], 16.0).padding(.bottom,-8.0).edgesIgnoringSafeArea(.top)

        let accessoryHostingView = NSHostingView(rootView:titlebarAccessoryView)
        accessoryHostingView.frame.size = accessoryHostingView.fittingSize

        let titlebarAccessory = NSTitlebarAccessoryViewController()
        titlebarAccessory.view = accessoryHostingView       

        // Create the window and set the content view. 
        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")

        // Add the titlebar accessory
        window.addTitlebarAccessoryViewController(titlebarAccessory)

        window.contentView = NSHostingView(rootView: contentView)
        window.makeKeyAndOrderFront(nil)
    }

TitlebarAccessory.swift

import SwiftUI

struct TitlebarAccessory: View {
    var body: some View {

        TextField("Placeholder", text: .constant(""))

    }
}

结果:

macOS工具栏中的内容

方法2(替代方法):

这里的想法是使用情节提要来完成工具栏部分,而使用SwiftUI来完成应用程序的其余部分。这是通过创建一个以故事板作为用户界面的新应用程序来完成的。然后转到情节提要,删除默认的View Controller并添加一个新的NSHostingController。通过设置其关系将新添加的Hosting Controller连接到主窗口。使用界面生成器将工具栏添加到窗口中。

故事板配置

将自定义类附加到您的类,NSHostingController并将您的SwiftUI视图加载到其中。

下面的示例代码:

import Cocoa
import SwiftUI

class HostingController: NSHostingController<SwiftUIView> {

    @objc required dynamic init?(coder: NSCoder) {
        super.init(coder: coder, rootView: SwiftUIView())       

    }

}

使用这种方法还可以自定义工具栏。


是否可以通过右键单击并选择“自定义工具栏”来使其可编辑?(类似于Finder,Pages等)
sqwk

1
对于第一种解决方案,没有。但是,请看我在上面的回复中添加的替代方法。这样,您可以选择自定义工具栏。
Bijoy Thangaraj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.