如何解决如何仅使用SwiftUI从@main App访问NSWindow? 更新:
在此answer,该解决方案适用于Scene和swiftUI。
但是像这样使用@main
@main
struct MyApp: App {
@StateObject private var model = MyModel()
var body: some Scene {
WindowGroup {
Router {
AppContent()
}.environmentObject(self.model)
}
}
}
我也尝试通过使用
来获取主窗口var window: NSWindow? {
let window = NSApplication.shared.mainWindow
return window
}
尽管如此,mainWindow
始终返回nil
更新:
由于需要遵守NSWindow
(必须返回ASWebAuthenticationPresentationContextProviding
),因此我需要NSWindow
。基本上,我正在尝试执行以下操作:
LoginView(store: AuthStore(window: window))
AuthStore
使用AuthenticationServices
进行身份验证的地方。
解决方法
基本上,我正在尝试执行以下操作:
LoginView(store: AuthStore(window: window))
这里是一个可能的方法演示(带有一些复制的实体)
class AuthStore {
var window: NSWindow
init(window: NSWindow) {
self.window = window
}
}
struct DemoWindowAccessor: View {
@State private var window: NSWindow? // << detected in run-time so optional
var body: some View {
VStack {
if nil != window {
LoginView(store: AuthStore(window: window!)) // << usage
}
}.background(WindowAccessor(window: $window))
}
}
struct WindowAccessor: NSViewRepresentable {
@Binding var window: NSWindow?
func makeNSView(context: Context) -> NSView {
let view = NSView()
DispatchQueue.main.async {
self.window = view.window // << right after inserted in window
}
return view
}
func updateNSView(_ nsView: NSView,context: Context) {}
}
struct LoginView: View {
let store: AuthStore
var body: some View {
Text("LoginView with Window: \(store.window)")
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。