@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해야하는 준수의 필요성 때문에 필요합니다 . 기본적으로 다음과 같은 작업을 시도하고 있습니다.ASWebAuthenticationPresentationContextProvidingNSWindow

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