@main 앱에서 SwiftUI 만 사용하여 NSWindow에 액세스하는 방법은 무엇입니까?
Aug 16 2020
이 답변 에서 솔루션은 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
하여 인증을 수행하기 위해.
답변
5 Asperi Aug 17 2020 at 00:29
기본적으로 다음과 같은 작업을 시도하고 있습니다.
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)")
}
}