MacOS 上的 SwiftUI。 - 打开一个新窗口

问题描述 投票:0回答:2

在我的 MacOS SwiftUI 应用程序中,我想在新 Windows 中显示一些视图。可以从代码的几个部分进行调用,因此我决定将其实现为像这样的特殊结构的静态函数。
工作正常 - 有什么可反对的吗?

struct Appwindows {
  
  static func newWindow(forSpecialView view: SpecialView, title: String = "new Window")
 { let newWindow = newWindowInternal(title: title)!
   
    newWindow.contentView = NSHostingView(rootView: view)
 }
  
  private static func newWindowInternal(title: String = "new Window") -> NSWindow!
 { var newWindow: NSWindow!
   newWindow = NSWindow(
     contentRect: NSRect(x: 20, y: 20, width: 680, height: 600),
     styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
     backing: .buffered,
     defer: false)
     newWindow.center()
     newWindow.isReleasedWhenClosed = false
     newWindow.title = title
     newWindow.makeKeyAndOrderFront(nil)
     return newWindow
 }
}

有没有办法让它更通用,以便任何类型的视图都可以传递给 func?

swift macos swiftui appkit
2个回答
14
投票

使您的函数通用并添加视图约束。

static func newWindow<Content: View>(forSpecialView view: Content, title: String = "new Window") { // <-- Here

另一个好的且简单的解决方案是使用

View
扩展。

extension View {
    private func newWindowInternal(with title: String) -> NSWindow {
        let window = NSWindow(
            contentRect: NSRect(x: 20, y: 20, width: 680, height: 600),
            styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
            backing: .buffered,
            defer: false)
        window.center()
        window.isReleasedWhenClosed = false
        window.title = title
        window.makeKeyAndOrderFront(nil)
        return window
    }
    
    func openNewWindow(with title: String = "new Window") {
        self.newWindowInternal(with: title).contentView = NSHostingView(rootView: self)
    }
}

用途:

struct ContentView: View {
    var body: some View {
        Button(action: {
            ContentViewNewWindow().openNewWindow()
        }) {
            Text("Open New Window")
        }
    }
}

0
投票

Xcode 16

Window("What's New", id: "whats-new") {
    Text("New in this version…")
}
struct ContentView: View {
    @Environment(\.openWindow) var openWindow

    var body: some View {
        Button("Show What's New") {
            openWindow(id: "whats-new")
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.