gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:07:24 25 4
gpt4 key购买 nike

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

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
}
}
有没有办法让它更通用,以便任何类型的 View 都可以传递给 func?

最佳答案

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

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")
}
}
}

关于MacOS 上的 SwiftUI。 - 打开一个新窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67344263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com